2011-05-05 130 views
24

我有以下代码:CakePHP的检查,如果用户登录在一个视图中

<?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 

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

+1

如果您服务于不同的用户行为有不同的看法(即未经验证的访问),你不应该只是满足了不同的看法? – kontur 2012-09-02 15:34:22

回答

29

注意:也检查出meotimdihia的answer below。它有一个Lotd upvotes。


Auth组件用于控制器。您需要检查控制器中的授权,然后为该视图设置一个变量,例如$this->set('authUser', $this->Auth->user());。然后,在你看来,你可以这样做:

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

如果你想要这个自动为所有控制器的方法来完成,你可以看看修改cake/libs/controller/app_controller.php,使其包括验证组件。

+0

为我工作。谢谢。 – 2012-02-15 06:16:27

+0

这是正确的答案http://stackoverflow.com/a/6497338/2274855 – 2013-11-12 15:15:14

+2

这是从CakePHP 2.x OUTDATED!使用jesal的答案! http://stackoverflow.com/a/18198982/1294758 – 2014-01-15 09:49:05

5

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

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

,然后用它认为这样

$auth->.... 

,或者你可以使用书面化AuthHelper由仅限Ritesh阿格拉瓦尔

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

BTW

我认为如果只涉及到测试是否有人登录@ webbiedave的回答 是更好的MVC风格明智。

不过,如果你要访问视图用户数据刚刚从验证分量来提取用户信息 并将其设置在控制器中,我向您展示,并用它在视图

问候

+0

beforeFile应该beforeFilter – Dunhamzzz 2011-05-05 17:28:11

+0

@Dunhamzz改变它... – 2011-05-05 17:30:32

+1

这是从CakePHP 2.x OUTDATED!使用jesal的答案! http://stackoverflow.com/a/18198982/1294758 – 2014-01-15 09:51:16

0

您需要从控制器中设置用户详细信息,最好是由站点上所有控制器继承的AppController。创建/修改你的app_controller.php以包含这个beforeFilter();方法。

<?php 
class AppController extends Controller { 

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

这会设置一个变种称为$user到这将是空的,如果用户没有登录,或包含它们的数据,如果他们的意见。

85

你不需要做$this->set(compact('authUser')); 只有在查看使用此:

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

这应该是被接受的 – zizoujab 2013-07-23 09:27:43

+7

这是从CakePHP 2.x OUTDATED!使用jesal的答案! http://stackoverflow.com/a/18198982/1294758 – 2014-01-15 09:49:55

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

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

'$ this-> Session'-但除此之外,我会去这个方法! – mark 2012-03-28 08:53:59

48

由于CakePHP的2.x时:

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

这适用于最新的CakePHP!其他答案已过时! – 2014-01-15 09:51:46

+1

对于CakePHP 3,这会导致一个致命错误,但是'$ this-> Session-> read'给出了一个不应该使用的实际代码的警告,就像@ LeeNelson的[answer](http://stackoverflow.com/a/29759420/327074) – icc97 2015-04-21 03:42:46

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_用户在视图

if($logged_user){ 
    // users logged in $logged_user have all the details 
}else{ 
    // not logged in 
} 
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'); 

} 

?> 
+4

我只是不明白为什么所有的功能和方式在cakephp中如此频繁地发生变化。你学习蛋糕2.4,然后3.0带有全新的语法。很烦人。 – 2015-05-20 12:25:29

+1

嘿RN Kushwaha,CakePHP遵循PHP,还有一个PHP 7,你在那个版本中使用了所有新东西吗? CakePHP 1.x到2.x只是让事情变得更好,CakePHP 3是从零开始创建到语言中的命名空间和所有新功能的全新框架。 – 2016-08-11 21:33:48

+0

@RNKushwaha同样的事情发生在代码点火器,laravel和yii ..我们必须经常遵循最新技术 – aswzen 2018-02-24 19:02:21

14

总结此页面上的答案,其上的CakePHP的版本,您使用的评估基于以下之一:

对于1.x版本

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

对于2.x版

AuthComponent::user('id') 

富勒3.x版

$this->request->session()->read('Auth.User.id') 
CakePHP中3
2

,你可以在这样

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

我发现了一些值得一提的数据视图中查看验证会话,在CakePHP 3.x会话处理程序已弃用,

如果我们想访问会话,我们可以通过reque st处理程序。我们必须使用

<?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')) { 

    } 
?> 
相关问题