如何在 yii2 中为经过身份验证的用户和来宾设置单独的 homeUrl

How to set separate homeUrl for authenticated users and guests in yii2

我想知道是否可以为经过身份验证的用户和来宾用户设置不同的 homeUrl?我在SiteController.php

中有这样的规则
public function behaviors()
{
    return [
        'access' => [
            'class' => AccessControl::className(),
            'only' => ['logout', 'signup'],
            'rules' => [
                [
                    'actions' => ['signup'],
                    'allow' => true,
                    'roles' => ['?'],
                    'denyCallback' => function() {
                        return $this->redirect('/account');
                    }
                ],
                [
                    'actions' => ['logout', 'condition'],
                    'allow' => true,
                    'roles' => ['@'],
                ],
            ],
        ],
        'verbs' => [
            'class' => VerbFilter::className(),
            'actions' => [
                'logout' => ['post'],
            ],
        ],
    ];
}

这应该不是什么大问题。我的回答结构如下:

  1. 访客用户配置
  2. 登录用户配置(覆盖)
  3. 备选方案

1。来宾用户的配置

这个很简单。只需将主页 URL 设置为您希望来宾访问者登陆的任何位置。将其放入您的配置中:

//...
'homeUrl'=>'site/home-guests',
//...

2。登录用户的配置(覆盖)

通过表单提交、cookie(记住我)、会话或访问令牌,每次页面加载都会发生登录。你不会注意到这一点,因为它会自动发生,除了实际的表单登录。

yii\web\User-class有一个事件,每次登录后都会触发。它被称为 yii\web\User::EVENT_AFTER_LOGIN。您可以找到触发方法 here.

的文档

要满足您的要求,只需扩展用户 class 并在 init() 方法中附加一个事件处理程序。如果抛出提到的事件,请更改主页 URL。完成!

这是自定义用户的代码 class:

class User extends \yii\web\User {
    //...
    public function init() {
        parent::init();

        //listen to after login event
        $this->on(static::EVENT_AFTER_LOGIN, function ($event) {
            Yii::$app->setHomeUrl(Url::to(['site/home-logged-in']));
        });
    }
    //...
}

要让 Yii 使用您的自定义和扩展 class,只需在配置中告诉它:

//...
'user'=>[
    'class'=>'app\components\User',    
],    
//...

3。备选方案

如果这与 URL 无关,而只是为了根据用户的登录状态向用户显示不同的内容,您还有其他/更简单的选择:

  • 登录时显示不同的视图但使用相同的操作
  • 在操作方法中重定向它们
  • if/else 实际主视图

哪一个是正确的取决于您的详细要求。根据您提供的信息很难判断。

如果您还有其他问题,请告诉我。我很乐意提供帮助!