当我更新用户模型中的数据时,Auth数据不会更新。
当我更新用户模型时,如何“刷新”$ this-> Auth-> user()返回的数据?
我不想使用
更新我的用户表后$这 - > Auth->登录($数据);
答案 0 :(得分:25)
我尝试了以下这一行。它的作用很好 修改用户数据后,我写了以下一行
$this->Session->write('Auth', $this->User->read(null, $this->Auth->User('id')));
答案 1 :(得分:7)
将更新的数据写入会话,例如:
$this->Session->write('Auth.User', $data);
在CakePHP 2.x之前,如果不破坏框架设计,你就不能在模型中做到这一点。
使用CakePHP 2.x,您可以从模型加载会话组件并更新它。
答案 2 :(得分:5)
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);
}
来源:my paste
将它放在AppController中。该方法专门用于合并当前和新用户数据,以保留您可能提供的现有自定义索引。我需要这个,但你可以把它留下来。 将更新的用户数据作为参数提供给方法。不在模型查找表单中。 E.g:
$data = array(
'User' => array(
'username' => 'bla',
'passwort' => 'fu',
'email' => 'hu@bar.com'
)
);
// Wrong
$this->renewUserSession($data);
// Right
$this->renewUserSession($data['User']);
答案 3 :(得分:0)
我使用afterSave
模型中的User
函数解决了这个问题。如果我们从任何区域更新用户模型,它工作正常。我的代码如下:
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;
}
... ... ...
}
答案 4 :(得分:0)
我认为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,并在修改登录用户后从任何控制器使用它。
我相信它更清洁,即使它意味着访问数据库,我认为它不会经常被执行成为一个问题。
你应该总是尝试做一些事情" Cake"办法。并避免编辑会话变量等快捷方式。从长远来看,它会让你更轻松。
请评论并添加您的意见:))
答案 5 :(得分:0)
我认为更简单的方法是:
$user = $this->Auth->user();
$user['attribute'] = $newValue;
$this->Auth->setUser($user);
答案 6 :(得分:0)
CakePHP 4 答案:-
$this->Authentication->getResult()->getData()->offsetSet('fullname', $user->fullname);
将fullname
替换为您更改的用户实体的字段名称。
也许有更好的方法,但这是我在玩了很多之后发现的(目前,CakePHP 4 API尚未发布https://api.cakephp.org/4.0/)