4

我想根据用户是否登录向他们显示不同的导航栏。我已经处理了注册和登录阶段,但无法检查用户是否已登录并显示正确的导航栏。

这就是我所拥有的AppController.php

public $components = array('Session', 'Auth' => array(
    'loginRedirect' => array('controller' => 'users', 'action' => 'account'),
    'logoutRedirect' => array('controller' => 'pages', 'action' => 'home')
));

public $loggedIn = false;

public function beforeFilter() {
    $this->Auth->allow('home', 'register', 'login');
    if ($this->Auth->user('id')) {
        $this->set('loggedIn', true);
    }
}

然后在我的布局中(不是视图):

<?php if ($loggedIn): ?>
    logged in
<?php else: ?>
    <li class="right"><a href="/register">Register</a></li>
    <li class="right"><a href="/login">Login</a></li>
<?php endif; ?>

然而,$loggedIn总是假的。如果$this->set('loggedIn', $this->loggedIn);从我的个人控制器中执行它可以正常工作,但是为了保持我的代码干燥,我只希望它在我的所有其他控制器从 ( AppController) 继承的控制器中。

有没有一种我想念的简单方法来做到这一点?

4

4 回答 4

7

尝试使用:

if ($this->Auth->loggedIn()) {
于 2012-07-10T21:06:34.797 回答
7

我知道这已经得到了回答,但无论如何我都会发布我的发现..

我解决此问题并使 $loggedIn 全局可用的方法是将其添加到 beforeFilter() 中的 AppController.php 文件中

public function beforeFilter() {
    $this->set('loggedIn', $this->Auth->loggedIn());
}
于 2013-05-31T00:35:53.403 回答
2

对于cakephp3

控制器范围:

public function beforeFilter(Event $event) {
    $this->set('login_status', $this->Auth->user('id'));
}

在模板中,您可以检查会话对象

$user = $this->request->session()->read('Auth.User');
于 2016-01-19T14:05:57.847 回答
1

只需将此代码放在 login() 操作之后:

if($this->Auth->loggedIn()){
        $this->redirect(array('action' => 'index'));
    }
于 2013-04-17T16:56:37.210 回答