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身份数据在请求之间被序列化(和反序列化)。

这导致我们仔细看__sleepZend_Db_Table_Row_Abstract类的方法,这是被调用一次的对象$user对象被序列化。

public function __sleep() 
{ 
    return array('_tableClass', '_primary', '_data', '_cleanData', '_readOnly' ,'_modifiedFields'); 
} 

你需要做的是在你的Person类重写此方法,以便它包括$_cdata阵列为好。然后该属性将被序列化并在下一个HTTP请求中可用。

+0

谢谢!我不会自己去那里。 – 2011-04-29 17:06:35

+0

是的,我可以清楚地记得几个小时内被同样的问题困住了。快乐的编码! – Vika 2011-04-29 17:36:47