Yii2 导航小部件可见且可访问

Yii 2 nav widget visible vs accessible

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

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

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->username这一行。 我使用第二种解决方案,效果很好,但是你能解释一下为什么代码执行时绕过第一个块的 'visible' 参数吗?

在第二种情况下,您检查不是客人,这意味着

 Yii::$app->user

是正确的对象,然后您可以访问用户名

首先,您只使用可见的菜单项属性,如 doc mean

中所述

http://www.yiiframework.com/doc-2.0/yii-widgets-menu.html#$items-detail

Visible: boolean, optional, whether this menu item is visible. Defaults to true.

这意味着该属性管理菜单项的隐藏或显示。但是在这种情况下,用户的代码保持不变,因此基于来宾没有创建正确的用户对象这一事实,您无法访问空对象的属性

在您的第一个代码块中

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

改为

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

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

如果没有登录用户Yii::$app->user->identity->username语句不能returnusername因为没有用户身份存在(Yii::$app->user->identitynull)