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

时间:2016-10-17 08:05:21

标签: yii2 yii2-advanced-app yii2-user

我想知道是否可以为经过身份验证的访客用户制作不同的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 个答案:

答案 0 :(得分:1)

这不应该是一个很大的问题。我的答案结构如下:

  1. 为访客用户配置
  2. 登录用户的配置(覆盖)
  3. 替代
  4. 1。为访客用户配置

    这个很容易。只需将主页URL设置为您希望访客访问者登录的任何内容。把它放在你的配置中:

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

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

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

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

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

    下面是自定义用户类的代码:

    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使用您的自定义和扩展类,只需在配置中告诉它:

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

    3。替代

    如果它不是关于URL,而只是根据用户的登录状态向用户显示不同的内容,那么您有其他/更简单的选择:

    • 登录时显示不同的视图但使用相同的操作
    • 在操作方法
    • 中重定向它们
    • if / else in the real home-view

    哪一个是正确的取决于您的详细要求。这很难说明您提供的信息。

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