Zend会话标识丢失对象参数
问题描述:
我有一个奇怪的问题,我似乎无法追查。 我有一个自定义类(“人”)扩展Zend_Db_Table_Row_Abstract代表一个用户。 除其他事项外,这个类具有被在init()方法设置自定义变量,例如:Zend会话标识丢失对象参数
class Person extends Zend_Db_Table_Row_Abstract
{
protected $_cdata = array(); // non-db-table data gets put here through __set()
public function init()
{
$this->fullName = $this->firstName." ".$this->lastName; // this is saved to $this->_cdata['fullName']
}
一旦登录,我存储这个类作为Zend的验证身份的一个目的:
$r = $auth->authenticate($authAdapter);
if($r->isValid())
{
$user = $db->getUserByEmail($email); // Retrieves an object of class "Person"
$auth->getStorage()->write($user);
}
现在,如果我叫验证身份在同一动作请求作为登录,它会好起来的工作:
echo $user->fullName; // Will print "John Smith" or whatever it is
然而,当我调用另一个动作,并调用验证身份,我失去了存储在“_cdata”数组中的所有内容:
$auth = Zend_Auth::getInstance();
if($auth->hasIdentity() {
$user = $auth->getIdentity();
echo $user->fullName; // Prints nothing...$_cdata['fullName'] does not exist.
}
任何想法?
答
发生这种情况的原因是因为Zend_Auth
身份数据在请求之间被序列化(和反序列化)。
这导致我们仔细看__sleep
Zend_Db_Table_Row_Abstract
类的方法,这是被调用一次的对象$user
对象被序列化。
public function __sleep()
{
return array('_tableClass', '_primary', '_data', '_cleanData', '_readOnly' ,'_modifiedFields');
}
你需要做的是在你的Person
类重写此方法,以便它包括$_cdata
阵列为好。然后该属性将被序列化并在下一个HTTP请求中可用。
谢谢!我不会自己去那里。 – 2011-04-29 17:06:35
是的,我可以清楚地记得几个小时内被同样的问题困住了。快乐的编码! – Vika 2011-04-29 17:36:47