2016-04-06 17:24:29 5960次浏览 3条回答 0 悬赏 20 金钱
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;
    }
}

最佳答案

  • javalzbin 发布于 2016-04-06 18:02 举报

    个人感觉逻辑不太对,登录认证应该在控制器中就控制了,而不是应该在模型中去判断,请求肯定是先到控制器,然后对应的action中进行处理,action负责加载一个数据模型,一般是从数据库中加载。那么,如果这个用户没有登录,应该在加载模型之前就判断好

    4 条回复
    回复于 2016-04-06 18:13 回复

    这边我分别在frontend\modules\user\Module.php 跟 frontend\modules\user\controllers\DefaultController.php里面的init()方法打了断点,这边是先执行Module.php后执行DefaultController.php,所以我想在该user module的入口直接做个判断,而不想到每个控制器里面去判断

    回复于 2016-04-06 18:39 回复

    自己写个Controller,重写beforeaction方法,统一验证,让你的处理业务的Controller继承它

    回复于 2016-04-07 08:40 回复

    按照你说的,但还是一样的问题,同样能执行到跳转代码,但就是不跳转。代码我放上面去

    回复于 2016-04-07 09:13 回复

    非常感谢,我让他在controller这边处理了,然后在跳转的后面加上send()就OK了。这应该是2.0.7的问题,我以前用2.0.6的时候第一种方法是能实现的。

  • 回答于 2016-04-06 17:36 举报

    return $this->goHome();

    1 条回复
    回复于 2016-04-06 17:43 回复

    感谢您的回答,我这段代码是在frontend/modules/user/Module.php这里边,你这个无法执行。

  • 回答于 2017-01-13 11:10 举报

    module.php

    if (Yii::$app->user->isGuest) {
        Yii::$app->response->redirect(['/account/login', 'ref'=>'/admin/index/index']);
        Yii::$app->end();
    }
    

    可以实现跳转。
    我的头头解释的。
    redirect可能有点类似于异步,在本地速度快,马上返回了302跳转,然后再return
    线上网速慢,本地还没收到302跳转,就return了,init收到return后,就会继续往下执行

    2 条回复
    回复于 2017-01-18 11:43 回复

    谢谢你的回答

    回复于 2017-03-14 00:39 回复

    厉害了,成功了,不愧是头头

您需要登录后才可以回答。登录 | 立即注册
legend
副总裁

legend 上海普陀

注册时间:2014-08-18
最后登录:2021-04-21
在线时长:299小时28分
  • 粉丝8
  • 金钱3455
  • 威望20
  • 积分6645

热门问题