0

我想知道是否可以为经过身份验证的用户和来宾用户制作不同的 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'],
            ],
        ],
    ];
}
4

1 回答 1

1

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

  1. 来宾用户的配置
  2. 登录用户的配置(覆盖)
  3. 备择方案

1. 来宾用户的配置

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

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

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

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

-class 有一个事件,yii\web\User每次登录后都会触发。它叫yii\web\User::EVENT_AFTER_LOGIN. 您可以在此处找到触发方法的文档。

要满足您的要求,只需扩展用户类并在init()-method 中附加一个事件处理程序。如果提到的事件被抛出,请更改主页 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,而只是根据用户的登录状态向用户显示不同的内容,那么您还有其他/更简单的选择:

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

哪个是正确的取决于您的详细要求。这很难用你提供的信息来判断。

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

于 2016-10-17T11:34:09.330 回答