CakePHP检查用户是否在视图中登录

Cam*_*ron 24 php cakephp

我有以下代码:

    <?php

    if (!$this->Auth->user())
    {
        echo $this->element('header');
    }
    else
    {
        echo $this->element('header-bar');
    }

    ?>
Run Code Online (Sandbox Code Playgroud)

在我的视图中,应该为登录用户显示不同的标题,但会引发以下错误:

Notice (8): Undefined property: View::$Auth [APP/views/layouts/page.ctp, line 17]
Fatal error: Call to a member function user() on a non-object in /Users/cameron/Sites/thehive/app/views/layouts/page.ctp on line 17
Run Code Online (Sandbox Code Playgroud)

我该如何解决?谢谢

meo*_*hia 88

您不需要$this->set(compact('authUser')); 仅在View中使用它:

if ($this->Session->read('Auth.User')){
// do something 
}
Run Code Online (Sandbox Code Playgroud)

  • 这是CakePHP 2.x的结果!使用jesal的答案!! http://stackoverflow.com/a/18198982/1294758 (7认同)

jes*_*sal 50

从CakePHP 2.x开始:

<?php if (AuthComponent::user('id')): ?>
   Logged in as <?= AuthComponent::user('name') ?>
<?php endif; ?>
Run Code Online (Sandbox Code Playgroud)

  • 对于CakePHP 3,这将导致致命错误,但是`$ this-&gt; Session-&gt; read`会在您应该使用的实际代码中给出不建议使用的警告,例如@LeeNelson的[answer](http://stackoverflow.com/a/ 29759420/327074) (2认同)

web*_*ave 30

注意:另请参阅以下 meotimdihia的答案.它有很多赞成票.


Auth组件用于Controller.您需要在控制器中检查授权,然后为视图设置变量,例如$this->set('authUser', $this->Auth->user());.然后在您的视图中,您可以:

if (!$authUser)
{
    echo $this->element('header');
}
Run Code Online (Sandbox Code Playgroud)

如果您希望为所有控制器方法自动完成此操作,则可以查看修改cake/libs/controller/app_controller.php以使其包含Auth组件.

  • 这是CakePHP 2.x的结果!使用jesal的答案!! http://stackoverflow.com/a/18198982/1294758 (2认同)

Mr *_*ver 17

要总结此页面上的答案,请根据您使用的CakePHP版本评估以下其中一项:

对于版本1.x.

$this->Session->read('Auth.User')
Run Code Online (Sandbox Code Playgroud)

对于2.x版

AuthComponent::user('id')
Run Code Online (Sandbox Code Playgroud)

Fore版本3.x.

$this->request->session()->read('Auth.User.id')
Run Code Online (Sandbox Code Playgroud)


小智 11

这适用于Cakephp 3+(juts修改:"Auth.User.username"以适合您的会话数据)

<?php

if (is_null($this->request->session()->read('Auth.User.username'))) {

    echo "....logged out";

} else {

    echo "You are Logged in As " . $this->request->session()->read('Auth.User.username'); 

}

?>
Run Code Online (Sandbox Code Playgroud)

  • 我只是无法理解为什么所有的功能和方法都会在cakephp中频繁变化.你学习蛋糕2.4然后3.0带有所有新的语法.很烦人. (4认同)
  • **注意**,从 CakePHP 4+ 开始,您可能必须使用 `getRequest()` 和 `getSession()`。无论哪种方式,都会让我*错误:在布局中使用时调用未定义的方法 App\View\AppView::getRequest()* (2认同)

Jer*_* S. 5

有一段时间我使用了CakePHP,但据我记忆,CakePHP不支持Auth in View.你当然可以做的是在控制器中设置一个变量,以便在视图中使用它

<?
   class AppController {
     ....
     function beforeFilter(){
       ....
       $this->set('auth',$this->Auth);
     }
     ....
   }
?>
Run Code Online (Sandbox Code Playgroud)

然后在这样的视图中使用它

$auth->....
Run Code Online (Sandbox Code Playgroud)

或者您可以使用Ritesh Agrawal编写的AuthHelper

http://bakery.cakephp.org/articles/ragrawal/2008/07/29/authhelper

BTW

我认为如果仅测试某人是否登录@ webbiedave的回答是更好的MVC风格.

然而,如果您必须在视图中访问userdata,只需从Auth组件中提取userinfo,并在我向您展示时将其设置在控制器中并在视图中使用它

问候