0

在我看来,我正在尝试显示当前登录的用户信息,并认为我可以通过使用

echo "Welcome back " .$this->Session->read('Auth.User.username'). "

这将显示用户名,我可以使用相同的方法显示该数据库行中的其他字段,但是其他一些字段可以随时更新,但在用户注销并再次登录之前不会在用户页面上更新。

这是正确的方法吗?或者这可以做得更好,并以某种方式将一些代码放在 AppController 的 beforeFilter() 中,以继续更新每个页面加载时的变量?

4

3 回答 3

1

如果从 CakePHP 外部更新数据库并且没有调用任何控制器操作,似乎唯一的解决方案是在每个加载的页面上进行查询以获取当前值。

为此,您应该使用beforeFilterAppController 上的方法:

function beforeFilter(){
     $user = $this->User->field('name', array('User.id' => $this->Session->read('Auth.User.id')));
     $this->Session->write('Auth.User', $user);
}

否则,您可以使用 JavaScript 和 AJAX 不时获取数据。

于 2012-12-07T09:29:22.830 回答
0

如果您只是afterSave()在 User 模型上创建了一个,并在其中设置$this->Session->write('Auth.User') = $user;

这是未经测试的,但似乎应该可以工作 - 那么您的会话将始终是最新的任何更改。

编辑:

根据您的评论,如果数据是从您无权访问的第三方来源提取的,并且您需要确保在每次页面加载时都对其进行更新,那么是的,AppController 的 beforeFilter() 就可以了。

但是,如果您只在某些页面或某些元素上需要它,您可以调用更新,然后或通过元素的 requestAction。

于 2012-12-07T04:34:40.077 回答
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 . '!';
于 2012-12-07T13:06:25.050 回答