如何在 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。来宾用户的配置
这个很简单。只需将主页 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 实际主视图
哪一个是正确的取决于您的详细要求。根据您提供的信息很难判断。
如果您还有其他问题,请告诉我。我很乐意提供帮助!
我想知道是否可以为经过身份验证的用户和来宾用户设置不同的 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。来宾用户的配置
这个很简单。只需将主页 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 实际主视图
哪一个是正确的取决于您的详细要求。根据您提供的信息很难判断。
如果您还有其他问题,请告诉我。我很乐意提供帮助!