Ответ 1
Я пробовал следующую строку. Его работы хорошо меня После изменения пользовательских данных я написал следующую строку
$this->Session->write('Auth', $this->User->read(null, $this->Auth->User('id')));
когда я обновляю данные в модели User, данные Auth не обновляются.
Как я могу обновить данные, возвращаемые $this- > Auth- > user(), когда я обновляю модель пользователя?
и я не хочу использовать
$this- > Auth- > для входа ($ данные);
после обновления таблицы пользователя
Я пробовал следующую строку. Его работы хорошо меня После изменения пользовательских данных я написал следующую строку
$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' => '[email protected]'
)
);
// Wrong
$this->renewUserSession($data);
// Right
$this->renewUserSession($data['User']);
Я решил эту проблему, используя функцию afterSave
в User
Model. Он отлично работает, если мы обновляем модель пользователя из любой области. Мой код был следующим:
class User extends AppModel {
... ... ...
public function afterSave($created, $options = array()){
parent::afterSave($created,$options);
//updating authentication session
App::uses('CakeSession', 'Model/Datasource');
CakeSession::write('Auth',$this->findById(AuthComponent::user('id')));
return true;
}
... ... ...
}
Я думаю, что ответ 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);