跳到主要内容
PHP

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

管

管理员

PHP

2022年09月18日 1,681 次阅读
本页目录
在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

 

Related

相关文章

同分类文章 →
2026年07月11日 PHP

laravel什么样的方法适合放在模型中?什么适合用专门的服务类? cachedFavIds适合放在模型中吗?

一、适合放在模型中的方法Laravel 采用 ActiveRecord 风格,模型本身就是"数据 + 围绕该数据的操作"的载体。以下几类方法适合放模型: 关联关系:belongsTo、morphTo、hasMany 等。如 UserFav::userfavable()、UserFav::us

2026年04月13日 PHP

Vue3 静态文件放在同域名 Laravel 项目下

核心思路是:Vue3 构建后的静态文件放到 Laravel 的 public/ 目录下,通过 Laravel 路由的 catch-all 机制让 SPA 的前端路由正常工作。方案说明以 xx.com/admin 为例,整体架构如下:请求流程:xx.com/admin/* → Laravel

2025年08月18日 PHP

Laravel Eloquent 中可以通过静态方式调用的方法

在 Laravel Eloquent 中,可以通过静态方式调用的方法包括:1. 查询作用域 (Scopes)// 可以静态调用UserComment::active()->get();UserComment::where('status', 1)->first();2. Eloquent 内置的查询方法UserComment::fi

WeChat

扫码加我微信

微信二维码