我使用Zend_Auth对用户进行身份验证,然后将其详细信息存储在默认的Zend_Auth会话中。这意味着当用户编辑其详细信息时,在重新进行身份验证之前,这些更改不会反映在应用程序中。
我想避免这个问题:
user ID
存储在Zend_Auth
会话在每个请求中,我们使用在preDispatch()
会话中登录时存储的user ID
从Zend_Auth
挂钩中的数据库中获取用户的详细信息:
class Plugin_Auth extends Zend_Controller_Plugin_Abstract
{
public function preDispatch(Zend_Controller_Request_Abstract $request)
{
if ($auth->hasIdentity())
{
$id = $auth->getIdentity()->id;
$userModel = new Model_User();
$user = $userModel->fetchOne($id);
// Where do I store this user object ???
}
}
}
问题是:我在哪里存储这个User
对象?我认为我们不应该使用会话,因为会话的目标是持久化数据。但是,由于我们在每个请求中从数据库中重新获取数据,因此不需要持久性。只有user ID
必须是持久的。是否可以在User
中存储Zend_Registry
对象?
答案 0 :(得分:1)
我认为最好的例子是解释如何将新的auth详细信息写入 Zend_Auth 存储对象:
$userDetails = array('foo' => 'bar');
$storage = new Zend_Auth_Storage_Session();
// set sorage for Zend_Auth
Zend_Auth::getInstance()->setStorage($storage);
// write data to the storage
Zend_Auth::getInstance()->getStorage()->write($userDetails);
// read data from storage
var_dump(Zend_Auth::getInstance()->getStorage()->read());
// edit user's data
$userDetails = array('foo' => 'bar', 'foo', 'bar');
// write new data to storage
Zend_Auth::getInstance()->getStorage()->write($userDetails);
// read new written data from storage
var_dump(Zend_Auth::getInstance()->getStorage()->read());
我认为这解释了如何设置 Zend_Auth 存储空间,并在以后进行更改。
答案 1 :(得分:0)
使用Zend_Session_Namespace
存储对象。它可以像您希望的那样暂时或永久。
Zend_Auth已经在后台使用它作为使用Zend_Auth
命名空间的默认存储机制。
class Plugin_Auth extends Zend_Controller_Plugin_Abstract
{
public function preDispatch(Zend_Controller_Request_Abstract $request)
{
$session = new Zend_Session_Namespace('user');//instantiate session namespace
if ($auth->hasIdentity())
{
$id = $auth->getIdentity()->id;
$userModel = new Model_User();
$user = $userModel->fetchOne($id);
$session->user = $user;//store the object can be recalled anywhere
}
}
}
当然Zend_Registry也会起作用,而且一如既往地选择你的。您甚至可能会发现将此功能构建到您的身份验证适配器中是合适的。
答案 2 :(得分:0)
我相信在你的情况下使用Zend_Registry很好。