Zend Session Identity теряет параметры объекта - PullRequest
0 голосов
/ 29 апреля 2011

У меня странная проблема, которую я не могу отследить. У меня есть пользовательский класс ("Person"), расширяющий Zend_Db_Table_Row_Abstract, который представляет пользователя. Среди прочего, этот класс имеет пользовательские переменные, которые устанавливаются в методе init (), например:

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 Auth Identity:

$r = $auth->authenticate($authAdapter);
if($r->isValid())
{
  $user = $db->getUserByEmail($email); // Retrieves an object of class "Person"
  $auth->getStorage()->write($user);
}

Теперь, если я вызову Auth Identity в том же запросе действия, что и логин, он будет работать нормально:

echo $user->fullName; // Will print "John Smith" or whatever it is

Однако, когда я вызываю другое действие и вызываю Auth Identity, я теряю все, что хранится в массиве "_cdata":

$auth = Zend_Auth::getInstance();
if($auth->hasIdentity() {
   $user = $auth->getIdentity();
   echo $user->fullName; // Prints nothing...$_cdata['fullName'] does not exist.
}

Есть идеи?

1 Ответ

5 голосов
/ 29 апреля 2011

Причина, по которой это происходит, заключается в том, что Zend_Auth идентификационные данные сериализуются (и десериализуются) между запросами.

, что приводит нас к более детальному рассмотрению метода __sleep класса Zend_Db_Table_Row_Abstract, которыйтот, который вызывается один раз $user объект, сериализуется.

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

Вам нужно переопределить этот метод в вашем классе Person, чтобы он также включал массив $_cdata.Затем это свойство будет сериализовано и доступно в следующем HTTP-запросе.

...