【问题标题】:Yii 2 nav widget visible vs accessibleYii2 nav 小部件可见且可访问
【发布时间】:2017-05-01 13:07:11
【问题描述】:

我有一个 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。 我使用第二个解决方案,效果很好,但你能解释一下为什么代码执行绕过第一个块的“可见”参数吗?

【问题讨论】:

  • 如果你用false代替!Yii::$app->user->isGuest会发生什么?
  • 我得到同样的错误,似乎即使它不可见,它仍然执行。因此,如果没有登录用户,则会引发异常。

标签: yii yii2 yii2-advanced-app


【解决方案1】:

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

 Yii::$app->user

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

首先,您只使用可见的 menuitem 属性,如 doc mean 中所述

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

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

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

【讨论】:

  • 讨论第一种情况:如果菜单项不可见,为什么它关心 Yii::$app->user 的存在?
  • 如果菜单不可见,代码也会被执行 .. .. 特别是 .. 'label' => 'Logout ('. Yii :: $ app-> user-> identity -> username. ')', 被执行以确定item的标签.. 即使它没有显示出来.. 希望清楚..
【解决方案2】:

在您的第一个代码块中

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

【讨论】:

    猜你喜欢
    • 2015-07-22
    • 2016-08-29
    • 1970-01-01
    • 2015-12-11
    • 2021-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多