在 Yii2 中处理来宾以防止不断检查

Handling Guests in Yii2 to prevent constant checks

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

例如,当您有一个登录用户时,您可以简单地通过以下电话获取他们的详细信息:

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

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

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

然而,显然当我们有一个 guest Yii::$app->user->identity returns null.

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

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

...在所有地方都这样做显然不太容易维护,所以我想提出一个解决方案,我可以只引用用户名而无需进行检查 - 但显然我仍然会这样做出于安全目的,客人会在需要的地方进行检查,但我正在尝试编写可维护的代码,因此想提出一个解决方案,用于我只需要他们的用户名等信息的目的。

我不确定 Yii2 目前是否有任何推荐的方法来执行此操作,但我想也许可以扩展 yii\web\User class 并执行如下所示的操作:

public function getIdentity() {

    $identity = parent::getIdentity();

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

    return $identity;

}

这是实现我想要的目标的明智方法还是有更好的方法?

扩展用户是个好主意,但您最好在其中添加新方法,例如 getUsername() 或 getAttributes() returning identity/guest 默认数据。 您的方式将破坏基于 'getIdentity' null/not null return 的用户 'getIsGuest' 方法。而且我相信这种方法是必不可少的,改变它的响应可能会破坏你应用程序中的很多其他东西。

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

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