2008-11-20 1 views
3

Я такая ситуации: Я loged пользователя, стандартная проверка подлинности с БД таблицейОбновление Zend_Auth_Storage после редактирования профиля пользователя

$authAdapter = new Zend_Auth_Adapter_DbTable(Zend_Db_Table::getDefaultAdapter()); 
$authAdapter->setTableName('users'); 
$authAdapter->setIdentityColumn('user_name'); 
$authAdapter->setCredentialColumn('password'); 

Когда пользователь редактирует свой профиль, я сохранить его в Db, но мне нужно обновить также (используя стандартный Zend_Auth_Storage_Session). Есть ли простой способ, как это сделать? Большое спасибо.

ответ

5

Лучше всего не использовать хранилище Zend_Auth для хранения информации, которая может измениться - по умолчанию она содержит только идентификатор (по уважительной причине). Я бы, вероятно, создал класс User, который объединил все функции Auth, ACL (и, возможно, профиля), которые используют статический метод get_current() для загрузки пользователя, спрятанного в сеансе. Это обходит все проблемы согласованности, с которыми вы сталкиваетесь, добавляя их в сеанс, а также предоставляя вам одну точку, из которой можно реализовать кэширование, если/когда вам действительно нужно повысить производительность.

+0

это имеет смысл, спасибо за совет – 2008-11-21 09:43:50

3

Я сделал это так, она работает, но я не знаю, если есть не какой-то лучший способ, как сделать это

$user_data = User::getUser($user_id)->toArray(); 
unset($user_data['password']); 

$std_user = new stdClass(); 

foreach ($user_data as $key => $value) 
{ 
    $std_user->$key = $value; 
} 

$auth = Zend_Auth::getInstance();  
$auth->getStorage()->write($std_user); 
8
$user = Zend_Auth::getInstance()->getIdentity(); 
$user->newValue = 'new value'; 

Предполагая, что вы обновляете данные сессии в тот же оператор, который вы обновляете в базе данных, не нужно снова вызывать db.