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

问题描述 投票:0回答:13

我有以下代码:

    <?php

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

    ?>

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

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

我该如何解决这个问题?谢谢

php cakephp
13个回答
90
投票

你不需要做

$this->set(compact('authUser'));
仅在视图中使用它:

if ($this->Session->read('Auth.User')){
// do something 
}

50
投票

自 CakePHP 2.x 起:

<?php if (AuthComponent::user('id')): ?>
   Logged in as <?= AuthComponent::user('name') ?>
<?php endif; ?>

31
投票

注意: 另请查看下面 meotimdihia 的 答案 。它获得了很多的支持。


Auth 组件用于控制器中。您需要检查控制器中的授权,然后为视图设置一个变量,例如

$this->set('authUser', $this->Auth->user());
。那么在你看来你可以这样做:

if (!$authUser)
{
    echo $this->element('header');
}

如果您希望所有控制器方法自动完成此操作,您可以考虑修改

cake/libs/controller/app_controller.php
,使其包含 Auth 组件。


24
投票

要总结本页上的答案,请根据您使用的 CakePHP 版本评估以下内容之一:

对于版本 1.x

$this->Session->read('Auth.User')

对于版本 2.x

AuthComponent::user('id')

对于 3.x 版本

$this->request->session()->read('Auth.User.id')

对于 4.x 版本,使用

Authentication
组件 v.2

$this->loadHelper('Authentication.Identity');
...
$this->Identity->isLoggedIn()

对于版本 5.x,请参阅较新的

Authentication
组件 v.3


11
投票

这适用于 Cakephp 3+(只需修改:“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'); 

}

?>

5
投票

我使用 CakePHP 已经有一段时间了,但据我所知 CakePHP 不支持在视图中进行身份验证。当然,您可以做的是在中设置一个变量 控制器在视图中使用它

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

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

$auth->....

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

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

顺便说一句

我认为如果只是测试是否有人登录@webbiedave的答案 MVC 风格更好。

尽管如此,如果您必须在视图中访问用户数据,只需提取用户信息 从 Auth 组件中将其设置在控制器中,正如我向您展示的那样,然后在视图中使用它

问候


2
投票

试试这个

class AppController extends Controller{
    $this->user = false;

   public function beforeFilter(){
     $this->user = $this->Auth->user();
   }

   public function beforeRender(){
      $this->set('logged_user',$this->user);
   }
}

现在您可以在视图中检查 $logged_user

if($logged_user){
  // users logged in $logged_user have all the details
}else{
  // not logged in
}

2
投票

在 cakephp 3 中,您可以在视图中检查身份验证会话,如下所示

if($this->request->Session()->read('Auth.User')){
//do when login
}
else{
 //do not login
}

2
投票

如果它对 cakephp 版本 3.7.8 中的任何人有帮助,会话已被降价为 getSession,因此更新 Lee Nielsen 的评论

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

echo "....logged out";

} else {

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

}

2
投票

对于 cakephp 4.2.6 Strawberry 和 Auth 组件

        <?php 
        // Note: Change email param to yours
        if (is_null($this->request->getSession()->read('Auth')->email)) {
        ?>
            <?= $this->Html->link(__('Login'), [ 'action' => 'login','controller' => 'Users']) ?>
            

        <?php 
        } else { ?>
            <?= $this->Html->link(__('Logout'), [ 'action' => 'logout','controller' => 'Users']) ?>
            
        <?php }
        ?>
        

0
投票

您需要从控制器设置用户详细信息,最好是由站点上的所有控制器继承的 AppController。创建/修改您的 app_controller.php 以包含此

beforeFilter();
方法。

<?php
class AppController extends Controller {

function beforeFilter() {
    $user = $this->Auth->user();
    $this->set(compact('user'));
}

这将为视图设置一个名为

$user
的变量,如果用户未登录,该变量将为空;如果用户登录,则包含其数据。


0
投票
//In the views (or layout)
$session->check('Auth.User.id');

//In controller
$this->Auth->User('id'); 

0
投票

我发现一些值得一提的事情,在 CakePHP 3.x 中,会话处理程序已被弃用,

如果我们想在视图中访问会话,我们可以通过请求处理程序来完成。我们必须使用

<?php
   // For CakePHP 3.x to access all user information
   $this->request->session()->read('Auth.User');

  // For CakePHP 3.x to check session
  if($this->request->session()->read('Auth.User.id')) {

  }
?>
最新问题
© www.soinside.com 2019 - 2024. All rights reserved.