0

追跡できないような奇妙な問題があります。ユーザーを表す Zend_Db_Table_Row_Abstract を拡張するカスタム クラス ("Person") があります。特に、このクラスには、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.
}

何か案は?

4

1 に答える 1

5

これが発生する理由は、Zend_AuthID データが要求間でシリアライズ (およびデシリアライズ) されるためです。

これにより、オブジェクトがシリアライズされると呼び出されるクラスの__sleepメソッドを詳しく見ることができます。Zend_Db_Table_Row_Abstract$user

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

必要なことは、Personクラスでこのメソッドをオーバーライドして、$_cdata配列も含めるようにすることです。次に、このプロパティがシリアル化され、次の HTTP 要求で使用できるようになります。

于 2011-04-29T16:53:45.393 に答える