frontend/modules/user/Module.php
namespace frontend\modules\user;
class Module extends \yii\base\Module
{
public $controllerNamespace = 'frontend\modules\user\controllers';
public function init()
{
parent::init();
//该模块必须登陆用户访问
if (\Yii::$app->user->isGuest){
return \Yii::$app->response->redirect(\Yii::$app->homeUrl);
}
return true;
}
}
return \Yii::$app->response->redirect(\Yii::$app->homeUrl);
这端代码能执行,就是不能跳转
下面是在controller里面实现的逻辑
Application.php
public function beforeAction($action)
{
if (!parent::beforeAction($action)) {
return false;
}
if (Yii::$app->user->isGuest){
return $this->redirect(['site/index']);
}
return true;
}
同样能执行到跳转这边,就是跳转不来
解决方案
user module 所有controller都会继承该ApplocationController
<?php
namespace frontend\modules\user\controllers;
use Yii;
use yii\web\Controller;
class ApplicationController extends Controller
{
public function beforeAction($action)
{
if (!parent::beforeAction($action)) {
return false;
}
if (Yii::$app->user->isGuest){
return $this->goHome()->send();//这边需要家send(),不然无法跳转,Yii 2.0.7
}
return true;
}
}
个人感觉逻辑不太对,登录认证应该在控制器中就控制了,而不是应该在模型中去判断,请求肯定是先到控制器,然后对应的action中进行处理,action负责加载一个数据模型,一般是从数据库中加载。那么,如果这个用户没有登录,应该在加载模型之前就判断好
return $this->goHome();
module.php
可以实现跳转。
我的头头解释的。
redirect可能有点类似于异步,在本地速度快,马上返回了302跳转,然后再return
线上网速慢,本地还没收到302跳转,就return了,init收到return后,就会继续往下执行