laravel 中间件和控制器构造函数的执行顺序

时间:2022-09-18 17:44
在laravel 控制器构造函数中无法使用 session cookie 等需要中间件的逻辑
比如:
public function __construct()
{
    $this->user = \Auth::user();  //null
}
public function index()
{
    var_dump($this->user); // null
    var_dump(\Auth::user()); // OK, not null
}
 

再举个栗子:

protected function __construct() {
    cookie()->queue('abcd','aaaaaaaaa',10);  //先设置cookie
}
然后打印cookie (注意需要刷新下页面)
protected function __construct() { 
    dump(request()->cookie('abcd'));  //打印加密前的乱码字符 (JWVmJWNG...............),说明没生效
}

pubf index(){
   dump(request()->cookie('abcd'));   //打印 aaaaaaa 正常打印
}


在这里会先调用控制器构造函数,然后实例化中间件,比如这篇博客中提出设计不合理质疑:https://blog.csdn.net/phper__/article/details/106452693

个人理解:并不是设计不合理而是laravel有个控制器中间件,需要实例化控制器调用,那么在构造函数中的 construct 中需要中间件的逻辑就会出错


来自StackOverflow解惑..
 

 

了解 Laravel生命周期和对象生命周期很重要。 创建新对象时,将首先调用构造函数。 当 new SectionsController() 的动作发生时,它会立即触发构造函数,因为构造函数调用了中间件,它无法知道它应该先运行。

这意味着在请求生命周期中,控制器构造函数必须在中间件之前。 幸运的是,这个问题已经解决了,如果你在构造函数中使用中间件依赖逻辑的回调,你将避免这个问题。

$this->middleware(function ($request, $next) {
    dump("SECTIONSCONTROLLER: ");
    dump(\Auth::check());
    return $next($request);  //...add
});

参考这里: https://stackoverflow.com/questions/61525116/laravel-midlleware-called-after-controller-construct
和 这里 : https://stackoverflow.com/questions/36607512/run-middleware-before-controllers-constructor-on-laravel-5-1