Ошибка Zend_Auth / Zend_Session и хранение объектов в Auth Storage - PullRequest
0 голосов
/ 31 января 2011

У меня возникла небольшая проблема с Zend_Auth, и я получаю сообщение об ошибке в моем Acl.

В моем контроллере входа я настраиваю свое хранилище Zend_Auth следующим образом

$auth   = Zend_Auth::getInstance();
$result = $auth->authenticate($adapter);

if ($result->isValid()) {
    $userId = $adapter->getResultRowObject(array('user_id'), null)->user_id;

    $user   = new User_Model_User;
    $users  = new User_Model_UserMapper;

    $users->find($userId, $user);

    $auth->getStorage()->write(
        $user
    );
}

Кажется, это работает хорошо, и я могу без проблем использовать объект, хранящийся в хранилище Zend_Auth в View Helpers. Проблема, с которой я, похоже, сталкиваюсь, заключается в том, что, когда я пытаюсь использовать это в своем Acl, ниже приведен фрагмент моего Acl, как только он достигает строки if($auth->hasIdentity()) {, я получаю подробное исключение ниже.

$user->getUserLevel() - это меторд в пользовательской модели, который позволяет мне преобразовать user_level_id, хранящийся в базе данных, в полное полное имя. Я предполагаю, что автозагрузчик видит такие меторды и пытается загрузить все необходимые классы.

Когда я смотрю на исключение, кажется, что он пытается найти класс, поскольку он хранится в модуле, у меня есть настройка пространства имен Auto Loader в моем application.ini.

Может ли кто-нибудь помочь с решением этой проблемы?

class App_Controller_Plugin_Acl extends Zend_Controller_Plugin_Abstract
{
    protected $_roleName;

    public function __construct()
    {
        $auth = Zend_Auth::getInstance();
        if($auth->hasIdentity()) {     
            $user = $auth->getIdentity();   
            $this->_roleName = strtolower($user->getUserLevel());        
        } else {
            $this->_roleName = 'guest';
        }
    }
}


Fatal error:  Uncaught exception 'Zend_Session_Exception' with message 'Zend_Session::start() -
\Web\library\Zend\Loader.php(Line:146): Error #2 include_once() [<a href='function.include'>function.include</a>]:
Failed opening 'Menu\Model\UserLevel.php' for inclusion
(include_path='\Web\application/../library;\Web\library;.;C:\php5\pear') Array' in \Web\library\Zend\Session.php:493

Stack trace:
#0 \Web\library\Zend\Session\Namespace.php(143): Zend_Session::start(true)
#1 \Web\library\Zend\Auth\Storage\Session.php(87): Zend_Session_Namespace->__construct('Zend_Auth')
#2 \Web\library\Zend\Auth.php(91): Zend_Auth_Storage_Session->__construct()
#3 \Web\library\Zend\A in \Web\library\Zend\Session.php on line 493 

Спасибо

Martin

1 Ответ

0 голосов
/ 01 февраля 2011

Проблема связана с отменой сериализации объекта. Исключение говорит вам, что не так. Zend_Loader не может найти ваш UserLevel класс (я предполагаю, что это член User_Model_User).

Правильно ли задан путь включения во время создания ACL?

Хакерский обходной путь будет добавить

require_once 'path/to/Menu/Model/UserLevel.php';

в ваш файл класса ACL.

...