在会话期间将模型实例存储为服务


Storing a model instance as a service during the session

我想访问整个应用程序中当前用户的配置文件(读/写)。用户配置文件是User模型的实例。是否可以将其作为服务存储在会话中?如果没有,最佳实践是什么?这是我的登录代码。(基于 AJAX 的登录)

    function loginAction()
{
    $this->view->disable();
    {
        $request = (array)$this->request->getJsonRawBody();
        $user = User::findFirstByUsername($request['username']);
        if (password_verify($request['password'], $user->password)) {
            $userModel = User::findFirst('username="'.$request['username'].'"');
            $this->getDI()['session']->set('auth', $user->id);
            $this->user = $user;
            jsonResponse($user);
        } else {
            http_response_code(401);
            jsonResponse(['message' => 'invalid']);
        }
    }
}

有几种方法可以实现这一点。让我与您分享我在自己的项目中使用的那个......

首先,我创建了一个组件来处理与身份验证相关的事情,例如检查当前会话状态(来宾、用户、管理员)、存储当前用户规范、身份验证过程等。

namespace MyApp'Components;
use Phalcon'Mvc'User'Component as PhComponent;
class Authentication extends PhComponent
{
  // ...
}

然后,我在主应用的 DI 容器中注册了此组件:

$di->setShared('authentication', 'MyApp'Components'Authentication');

所以我可以从我的控制器、视图等使用。喜欢:

function homeAction()
{
    //...
    if($this->authentication->isGuest()) {
    //...
}

最后使用会话存储数据。Phalcon 提供了一个持久会话包,可用于在当前会话中轻松存储模型的序列化版本:

class Authentication extends PhComponent
{
  // ...
  function authenticate($username, $password)
  {
        // ... Authentication logic
        if($validCredentials) {
              $this->persistent->currentUser = $userModel;
        }
        // ...
  }
}