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

时间:2014-11-28 07:31:15

标签: php session dependency-injection phalcon

我想访问应用程序中当前用户的配置文件(读/写)。用户配置文件是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']);
        }
    }
}

1 个答案:

答案 0 :(得分:0)

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

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

namespace MyApp\Components;

use Phalcon\Mvc\User\Component as PhComponent;

class Authentication extends PhComponent
{
  // ...
}

然后,我registered this component in the main App's DI容器:

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

所以我可以使用我的控制器,视图等。例如:

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

最后使用会话存储数据。 Phalcon提供persistent session bag,您可以使用它在当前会话中轻松存储模型的序列化版本:

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