cakephp 2.0 Как обновить данные auth?
когда я обновляю данные в пользовательской модели, данные Auth не обновляются.
Как я могу "обновить" данные, которые возвращаются $this - >Auth - >user () при обновлении модели пользователя ?
и я не хочу использовать
$this - >Auth - >login ($data);
после обновления моей таблицы пользователей
6 ответов
я попробовал следующую строку. Его работы хорошо формируют меня После изменения пользовательских данных я написал следующую строку
$this->Session->write('Auth', $this->User->read(null, $this->Auth->User('id')));
запишите обновленные данные в сеанс, например:
$this->Session->write('Auth.User', $data);
Перед CakePHP 2.x вы не можете сделать это в модели, не нарушив дизайн фреймворка.
С CakePHP 2.x компонент сеанса можно загрузить из моделей и обновить.
evert0ns ответ правильный. Но вы должны использовать AuthComponent:: login(), потому что данные также сохраняются в AuthComponent и не извлекаются из сеанса каждый раз.
у меня была проблема буквально пару дней назад.
// AppController.php
/**
* Renews current user data, e.g. in case of an email address change while being logged in.
*
* @param array $newUserData
* @return void
*/
protected function renewUserSession($newUserData){
if(!isset($newUserData) || empty($newUserData)){
return;
}
// We need to fetch the current user data so custom indexes are copied
$currentUserData = $this->Auth->user();
if(!isset($currentUserData) || empty($currentUserData)){
return;
}
// Merge old with new data
$newUserData = array_merge($currentUserData, $newUserData);
// Login with new data
$this->Auth->login($newUserData);
}
источник: мой вставить
поместите это в свой AppController. Метод специализируется на слиянии текущих и новых пользовательских данных для сохранения существующих пользовательских индексов, которые могут быть предоставлены. Мне нужно это, но вы можете оставить его. Дайте обновленные пользовательские данные в качестве параметра метода. Не в модели формы. Например:
$data = array(
'User' => array(
'username' => 'bla',
'passwort' => 'fu',
'email' => 'hu@bar.com'
)
);
// Wrong
$this->renewUserSession($data);
// Right
$this->renewUserSession($data['User']);
Я думаю, что ответ func0der хорош, но он может быть улучшен:
protected function renewLogin() {
if(!empty($this->Auth->user())) {
$this->loadModel('User');
$this->User->contain(false);
$user = $this->User->read(null, $this->Auth->user('id'))['User'];
unset($user['password']);
$this->Auth->login($user);
}
}
вы можете добавить это в свой AppController.PHP и использовать его с любого контроллера после изменения пользователя.
Я считаю, что это намного чище, и хотя это подразумевает доступ к базе данных, я думаю, что это не будет выполняться достаточно часто, чтобы быть проблемой.
вы всегда должны стараться делать вещи так, как "торт". И избегайте ярлыков, таких как редактирование переменной сеанса. Это сделать вещи проще для вас в долгосрочной перспективе.
пожалуйста, прокомментируйте и добавьте свои мнения:)
Я думаю, что простой способ сделать это:
$user = $this->Auth->user();
$user['attribute'] = $newValue;
$this->Auth->setUser($user);