У меня есть следующая ситуация: я зарегистрировал пользователя, стандартную аутентификацию с таблицей DB
$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). Есть ли простой способ, как это сделать? Большое спасибо.
Лучше всего не использовать хранилище Zend_Auth для хранения информации, которая может измениться – по умолчанию она содержит только идентификатор (по уважительной причине). Я бы, вероятно, создал класс User, который объединил все функции Auth, ACL (и, возможно, профиля), которые используют статический метод get_current () для загрузки пользователя, спрятанного в сеансе. Это обходит все проблемы согласованности, с которыми вы сталкиваетесь, добавляя их в сеанс, а также предоставляя вам одну точку, из которой можно реализовать кэширование, если / когда вам действительно нужно повысить производительность.
$user = Zend_Auth::getInstance()->getIdentity(); $user->newValue = 'new value';
Предполагая, что вы обновляете данные сеанса в том же операторе, который вы обновляете в базе данных, нет необходимости снова вызывать db.
Я сделал это так, это работает, но я не знаю, нет ли лучшего способа, как это сделать
$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);
с$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);