在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')); //打印加密前的乱码字符 (),说明没生效 } 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