如何在CakePHP中使用全局范围设置$ currentuser变量

时间:2013-12-18 21:08:32

标签: php cakephp cakephp-2.0

我正在使用CakePHP v2.4 ......

我想创建一个db请求来设置$ currentuser变量,我可以在所有控制器中引用它。这看起来应该很简单,但它给了我一个艰难的时间,因为当用户登录时,$ this-> Auth-> user()在AppController的beforeFilter中不可用。因此该变量将在之后立即无效有人登录(直到他们重新加载页面等)。 afterFilter()和beforeRender()在其他控制器操作之后发生,这样就无法解决我的问题。

这样做的正确方法是什么?

3 个答案:

答案 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')

这应该适用于所有这些地点以及观点。