2009-09-17 4 views
5

Это очень просто. Я пишуКак работает память Zend_Auth?

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

И тогда я хочу, в отдельном процессе, чтобы загрузить это $ пользователю, но я не могу, потому что

$user = $auth->getIdentity(); 

пуст. Разве я не просто ... УСТАНАВЛИВАЕТ? Почему это не работает? Halp?

[EDIT 2011-04-13]

Это было предложено почти два года назад. Факт, однако, в том, что я повторил этот вопрос в июле 2010 года и получил фантастический ответ, который я тогда просто не понимал.

Ссылка: Zend_Auth fails to write to storage

С тех пор я построил очень хороший класс 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; 
    } 

} 

?> 
+0

Другая проблема может заключаться в том, что хранилище (и Zend_Auth) не имеет такой же конфигурации. Написание на одном месте, чтение на другом. – AsTeR

ответ

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(); 
} 

Вот реализация записи 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; 
} 

Вы уверены, что вы загружаете и тот же экземпляр класса Zend_Auth?

Вы используете

$auth = Zend_Auth::getInstance(); 

Может быть, вы вызываете метод записи после метода getIdentity?

В любом случае, как я уже говорил, все, что вы делаете, должно работать.

+0

Ну, я думаю, что я сделал всевозможные эксперименты с этой штукой, и все, что у меня было, это умственные синяки. В основном, я сделал это в книге, затем с изменениями, затем с переписаниями, затем с абстрактными случайными экспериментами, не достигнув какого-либо последовательного вывода. При обновлении хранилища он работал, но только в том случае, если пользователь приземлился на одной странице и, наконец, был бы полезным после следующего обновления. Если бы у меня было перенаправление, это не сработало бы, если бы оно не было в классе, который загружал другой класс, который обновлял хранилище и т. Д. И т. Д. Мое заключение состоит в том, что это дерьмо абсолютно случайно. Спасибо хоть. – John

+0

Просто для подтверждения настройки хранилища напрямую работает для меня. Я использую этот метод для принудительной идентификации в режиме отладки при отключении, поэтому я могу войти в систему с моей открытой страницей входа в ID. Я думаю, что это проблема сеанса, как описано, это ваша наиболее вероятная проблема. – Jai

0

Так что на перезагрузке страницы вы можете получить сеанс, а не при перенаправлении? Вы перенаправляетесь на другое доменное имя? Тогда это могут быть проблемы с Cookies, и вам нужно будет вручную установить переменную ini session.cookie_domain.

Проверьте, правильно ли установлен файл cookie с именем PHPSESSID, и если он отправляется на сервер при каждом запросе на страницу? Постоянно ли он или изменяется по каждому запросу?

Кроме того, вы можете проверить, правильно ли сохранены данные сеанса на диске. Сеансы можно найти в каталоге, определяемом переменной ini session.save_path. Является ли файл, соответствующий вашему PHPSESSID, и содержит ли он содержательную запись? В моем случае он содержит

[email protected]:~# less /var/lib/php5/sess_081fee38856c59a563cc320899f6021f 
foo_auth|a:1:{s:7:"storage";a:1:{s:9:"user_id";s:2:"77";}} 
+0

Nono, это тот же домен. Однако я проверю куки. К этому времени я почти уверен, что это может быть что угодно, в том числе глобальное потепление, хе-хе. – John

0

Добавить:

register_shutdown_function('session_write_close'); 

индексировать.php до:

$application->bootstrap()->run(); 
+0

Это не помогло –

Смежные вопросы