处理Yii2中的访客以防止不断检查

时间:2015-06-20 10:28:46

标签: php yii yii2 yii2-user

我想知道在guests中处理Yii2的推荐方法通常是什么。

例如,当您有登录用户时,您可以通过以下呼叫获取他们的详细信息:

$user = Yii::$app->user->identity;

然后,您可以执行以下内容,具体取决于您为他们提供的详细信息:

$user->username;
$user->email;

但是,很明显,当我们guest Yii::$app->user->identity返回null时。

在我的情况下,我经常需要检查用户是访客还是登录用户,因此必须在不同的地方重复这样的代码:

if (Yii::$app->user->isGuest) {
    $username = Yii::t('general', 'Guest');
} else {
    $username = Yii::$app->user->identity->username;
}

...到处做这件事显然不是很容易维护,所以我想提出一个解决方案,我可以在不用检查的情况下引用用户名 - 但显然我仍然会做客人检查出于安全目的需要的地方,但我试图编写可维护的代码,因此我想提出一个解决方案,用于我只需要用户名等信息的目的。

我不确定目前是否有任何建议的方式在Yii2中执行此操作,但我想也许可以扩展yii\web\User类并执行以下操作:

public function getIdentity() {

    $identity = parent::getIdentity();

    if (empty($identity)) {
        $identity = new stdClass();
        $identity->username = Yii::t('general', 'Guest');
    }

    return $identity;

}

这是实现我想要的方法还是更好的方法?

1 个答案:

答案 0 :(得分:3)

扩展用户是一个好主意,但你最好添加新的方法,如getUsername()或getAttributes()返回身份/来宾默认数据。 你的方法将破坏User的'getIsGuest'方法,该方法基于'getIdentity'null / not null return。而且我相信这种方法很重要,改变它的反应可能会破坏你应用中的很多其他东西。

更新。 您可以在config-> components-> user-> class:

中设置扩展用户类
[
    'components' => [
        'user' => [
            'class' => 'my\namespace\User'
        ]
    ]
]