Yii 2导航小部件可见vs可访问

时间:2017-05-01 13:07:12

标签: yii yii2 yii2-advanced-app

我有一个yii \ bootstrap \ Nav,我有几个菜单项。其中一个是注销。考虑这两个例子。

    $menuItems = [
            [
                'label'   => 'Logout ('. Yii::$app->user->identity->username. ')',
                'url'     => ['/site/logout'],
                'linkOptions' => ['data-method' => 'post'],
                'visible' => !Yii::$app->user->isGuest,
            ],
    ]

VS

if (!Yii::$app->user->isGuest) {
        $menuItems[] = 
                [
                    'label'   => 'Logout ('. Yii::$app->user->identity->username. ')',
                    'url'     => ['/site/logout'],
                    'linkOptions' => ['data-method' => 'post'],
                ];

}

我的应用程序因

的错误而崩溃
Trying to get property of non-object

与Yii :: $ app-> user-> identity->用户名一致。 我使用第二个解决方案工作正常,但你能解释为什么代码绕过第一个块的'visible'参数执行。

2 个答案:

答案 0 :(得分:1)

在第二种情况下,您检查的不是来宾,这意味着

 Yii::$app->user

是正确的客观,然后您可以访问用户名

首先,你只使用可见的menuitem属性,如doc mean

中所述

http://www.yiiframework.com/doc-2.0/yii-widgets-menu.html# $项细节

  

可见:布尔值,可选,此菜单项是否可见。   默认为true。

这意味着此属性管理菜单项的隐藏或显示。但是在这种情况下,用户的代码保持不变,因此基于以下事实:访客不会创建一个合适的用户对象,您可能会获得一个null对象的属性

答案 1 :(得分:0)

在您的第一个代码块中

Yii::$app->user->identity->username

将其更改为

(Yii::$app->user)?("Logout(".(Yii::$app->user->identity->username.")"):'Login'

注意:相应地更改url。配置不需要可见性。

如果没有登录用户Yii::$app->user->identity->username语句无法返回username,因为没有用户身份(Yii::$app->user->identitynull