全局中间件最先执行,路由中间件最后执行;Laravel采用洋葱模型,请求由外向内穿透(全局→路由组→路由级),响应则逆序返回,层级与Kernel.php中注册顺序严格对应。

全局中间件最先执行,路由中间件最后执行。
Laravel 中间件采用“洋葱模型”嵌套执行:请求从外向内穿透,响应从内向外返回。全局中间件位于最外层,包裹整个应用;路由中间件(包括路由组中间件和单个路由绑定的中间件)则层层向内,离控制器最近。
具体层级关系如下:
全局中间件
定义在app/Http/Kernel.php的$middleware数组中
所有 HTTP 请求必经此层,最早拦截请求、最晚处理响应
适合放基础支撑逻辑:如信任代理、维护模式、输入清理、加密 Cookie路由组中间件
定义在$middlewareGroups(如web、api),需显式绑定到Route::group()或使用Route::middleware('web')
包裹在全局中间件内层,但外于单个路由中间件
例如web组默认含StartSession、VerifyCsrfToken,顺序按数组从上到下执行路由级中间件
通过->middleware(['auth', 'throttle'])直接绑定到某条路由或控制器方法
处于最内层,紧邻控制器,适合做权限校验、参数预处理等业务强相关逻辑
注意:它不是“覆盖”前面的中间件,而是追加到整个栈的最末端
执行顺序示例(请求阶段):
- 全局中间件(如
TrustProxies→HandleCors→TrimStrings) - 路由组中间件(如
web组中的StartSession→VerifyCsrfToken) - 路由级中间件(如
auth→ensure-user-has-profile)
响应阶段则完全逆序:路由级中间件先处理响应,再逐层向外返回。
关键提醒:
- 不是“谁写在路由里靠前谁先跑”,而是看中间件类在
Kernel.php中的注册位置 - 同一中间件若在多个地方注册(比如既在
$middleware又在$routeMiddleware),会重复执行,务必避免 - 调试顺序最可靠的方式是在每个中间件
handle()开头加dd()或日志,观察实际调用流



















