Laravel5.3 中间件和控制器构造方法执行顺序问题

我在项目中创建了一个判断移动端还是PC端的中间件,然后发现中间件在控制器构造方法执行完后才调用了,然后重新建了个项目试了下。

class WebInit
{
/**
 * Handle an incoming request.
 *
 * @param  \Illuminate\Http\Request  $request
 * @param  \Closure  $next
 * @return mixed
 */
public function handle($request, Closure $next)
{
    dump('a');
    return $next($request);
}
}   

然后控制器里

class MainController extends Controller
{
  public function __construct()
{
    dump('b');
}
public function index(){
    dump('c');

}
}

最后访问一下本地

file

然后找了一下5.3的变更文档发现

file
想问一下laravel5.3以后这么处理的原因是什么,感觉这样想获取数据要每个方法都要从request里获取值挺麻烦的

《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
讨论数量: 6

我也遇到同样的问题。不知道有没有解决方案,本打算在中间层里从容器里拿到已经实例化好的controller对象,但也找不到路子。

5年前 评论
Complicated

为什么要这么做啊!控制器的构造早于中间件,那中间件的过滤作用不就没用了吗

5年前 评论

@Complicated 不啊,构造方法是在实例化的时候执行的,而request请求的是实例化后的其他方法,这不冲突啊,只是方便了在一个类中统一使用一个中间件,说到底是更方便了啊

5年前 评论
Complicated

@AbleYu 没提明白你说的意思(捂脸),,我就是想说,,有些时候吧,需要在构造函数里获取session,然后查询数据库,但是在中间件判断sesssion有没有值,没有值直接到登录界面!但是如果controller的构造函数早于中间件,那这样不就不行了

5年前 评论

@Complicated 在构造函数调用中间件

5年前 评论
Complicated

@AbleYu 你的意思是在 构造函数里定义中中间件还是在构造函数里绑定中间件?

5年前 评论
AbleYu 4年前

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!