在我看来,我试图显示当前登录的用户信息,并想通过使用
来做到这一点echo "Welcome back " .$this->Session->read('Auth.User.username'). "
这显示用户名,我可以使用相同的方法显示该数据库行中的其他字段,但是其他一些字段可以随时更新,但在用户页面上不会更新,直到他们注销并再次登录。 / p>
这是正确的方法吗?或者这可以做得更好,并以某种方式将一些代码放在AppController中的beforeFilter()中,以继续更新每个页面加载的变量?
答案 0 :(得分:1)
如果数据库是从CakePHP外部更新的,并且没有调用任何控制器操作,似乎唯一的解决办法是在每个加载的页面上进行查询以获取当前值。
为此,您应该在AppController上使用beforeFilter
方法:
function beforeFilter(){
$user = $this->User->field('name', array('User.id' => $this->Session->read('Auth.User.id')));
$this->Session->write('Auth.User', $user);
}
否则,您可以使用JavaScript和AJAX来不时获取数据。
答案 1 :(得分:0)
如果您只是在用户模型上创建afterSave()
,并在其中设置$this->Session->write('Auth.User') = $user;
这是未经测试的,但似乎应该可行 - 那么您的会话将始终是最新的任何更改。
修改强>
根据您的评论,如果数据是从您无权访问的第三方来源中提取的,并且您需要确保在每次加载页面时更新数据,那么是的,AppController的beforeFilter()是很好。
但是,如果您只在某些页面或某些元素上使用它,则可以调用更新,或者通过元素的requestAction调用。
答案 2 :(得分:0)
我更喜欢获取实时数据而不是会话数据
var $uses = array('User');
function beforeFilter(){
$id = $this->Auth->user('id'); //Using the session's user id is fine because it doesn't change/update
$user_data = $this->User->findById($id);
$user_fname = $user_data['User']['fname'];
$this->set('fname', $user_fname);
}
//In your view
echo 'Welcome Back '. $fname . '!';