我有一个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'参数执行。
答案 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->identity
为null
)