我正在使用CakePHP v2.4 ......
我想创建一个db请求来设置$ currentuser变量,我可以在所有控制器中引用它。这看起来应该很简单,但它给了我一个艰难的时间,因为当用户登录时,$ this-> Auth-> user()在AppController的beforeFilter中不可用。因此该变量将在之后立即无效有人登录(直到他们重新加载页面等)。 afterFilter()和beforeRender()在其他控制器操作之后发生,这样就无法解决我的问题。
这样做的正确方法是什么?
答案 0 :(得分:2)
您不必再进行其他查询,只需将身份验证适配器配置为为您提取数据:
public $components = array(
'Auth' => array(
'authenticate' => array(
'Form' => array(
'contain' => array(
// Whatever you want here
'Profile',
'Setting'
)
)
)
)
);
然后,您可以通过以下方式获取所有当前登录的用户数据:
$this->Auth->user()
即使你不重定向,如果你这样做,它仍将存在。
您应该使用这种方式通过直接访问会话来访问用户数据,因为用户组件正确地抽象它。参见:
为什么CakeSession :: read()不是最佳选择:
如果您没有使用基于会话的身份验证系统CakeSession :: read(“Auth.User”);会打破。如果Auth会话密钥由于某种原因发生变化,它也会中断,不太可能,但并非不可能。
同样调用静态CakeSession :: read(“Auth.User”)方法也不是最佳实践。可以扩展会话组件,您仍然可以使用别名通过$ this-> Session访问自定义的SessionComponent。
总的来说,我会避免将静态和单例添加到我的方法中 - 这使得测试它们或更改它们变得困难。我总是将它们包装在一个方法中。这样你就可以在测试中模拟它们。
答案 1 :(得分:1)
我以这种方式访问我的应用中的当前登录用户:
CakeSession::read("Auth.User");
它在我的AppController :: beforeFilter()
中答案 2 :(得分:0)
$this->Session->read('Auth.User')
这应该适用于所有这些地点以及观点。