谁一开始就是大神?

怎么限制usermodule必须登录才能访问[2.0]

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后,就会继续往下执行

赞(0) 打赏
未经允许不得转载:菜鸟之家 » 怎么限制usermodule必须登录才能访问[2.0]

评论 抢沙发

登录

找回密码

注册