在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
更新时间:2024-12-18 20:26