Zend_Auth存储如何工作?

Joh*_*ohn 5 storage zend-framework zend-auth

这很简单.我写

$auth->getStorage()->write($user);
Run Code Online (Sandbox Code Playgroud)

然后我想,在一个单独的进程中加载​​这个$ user,但我不能因为

$user = $auth->getIdentity();
Run Code Online (Sandbox Code Playgroud)

是空的.我不是只是......设定它?为什么不起作用?HALP?

[编辑2011-04-13]

大约两年前就有人问过这个问题.但事实是,我在2010年7月重复了这个问题并得到了一个很棒的答案,我当时根本就不明白.

链接:Zend_Auth无法写入存储

我已经构建了一个非常好的litte类,我使用与Zend_Auth相同的存储引擎在所有项目中使用(有时需要额外调整),但是避免了所有不好的事情.

<?php

class Qapacity_Helpers_Storage {

    public function save($name = 'default', $data) {

        $session = new Zend_Session_Namespace($name);
        $session->data = $data;

        return true;
    }

    public function load($name = 'default', $part = null) {

        $session = new Zend_Session_Namespace($name);

        if (!isset($session->data))
            return null;

        $data = $session->data;

        if ($part && isset($data[$part]))
            return $data[$part];

        return $data;
    }

    public function clear($name = 'default') {

        $session = new Zend_Session_Namespace($name);

        if (isset($session->data))
            unset($session->data);

        return true;
    }

}

?>
Run Code Online (Sandbox Code Playgroud)

Gas*_*ton 1

它应该可以工作。

这是 Auth getIdentity 函数的实现。

/**
 * Returns the identity from storage or null if no identity is available
 *
 * @return mixed|null
 */
public function getIdentity()
{
    $storage = $this->getStorage();

    if ($storage->isEmpty()) {
        return null;
    }

    return $storage->read();
}
Run Code Online (Sandbox Code Playgroud)

下面是 PHP Session Storage 写入和读取函数的实现:

/**
 * Defined by Zend_Auth_Storage_Interface
 *
 * @return mixed
 */
public function read()
{
    return $this->_session->{$this->_member};
}

/**
 * Defined by Zend_Auth_Storage_Interface
 *
 * @param  mixed $contents
 * @return void
 */
public function write($contents)
{
    $this->_session->{$this->_member} = $contents;
}
Run Code Online (Sandbox Code Playgroud)

您确定正在加载 Zend_Auth 类的同一个实例吗?

你正在用吗

$auth = Zend_Auth::getInstance();
Run Code Online (Sandbox Code Playgroud)

也许您在 getIdentity 方法之后调用 write 方法?

不管怎样,正如我之前所说,你所做的应该有效。