laravel路由中间件执行顺序为:全局→分组→路由级→控制器级;同一层级按声明顺序执行,最终合并为有序数组并通过pipeline从前到后执行。

在 Laravel 中,路由绑定的中间件(Middleware)执行顺序由两部分决定:路由定义时指定的中间件、以及控制器方法或类上声明的中间件。它们最终会合并成一个有序数组,并按“管道(Pipeline)”方式从前到后依次执行。
路由 Action 数组中的 Middleware 来源
Laravel 路由解析后生成的 Action 数组(可通过 $route->getActionName() 或 $route->action 查看)本身不直接包含 middleware 字段;真正的中间件列表来自:
- 路由定义时链式调用的
middleware()(如Route::get(...)->middleware(['auth', 'log'])) - 控制器构造函数或方法上标注的
@middleware注解(需启用注解支持) - 控制器类顶部的
$middleware属性(Laravel 9+ 已弃用,仅旧版本支持) - 控制器构造函数中调用的
middleware()(如$this->middleware('verified'))
Middleware 的实际合并与排序规则
所有中间件最终被收集到 Router 的 gatherMiddleware 流程中,并按以下优先级从前到后拼接:
- 全局中间件(
app/Http/Kernel.php中的$middleware)→ 最先执行 - 分组中间件(
Route::middleware([...])->group(...))→ 次之 - 路由级中间件(
->middleware([...]))→ 再次之 - 控制器级中间件(
$this->middleware()或注解)→ 最后追加
同一层级多个中间件,按声明顺序执行;不同层级之间严格遵循上述先后关系。例如:
Route::middleware(['web'])
->group(function () {
Route::get('/profile', [ProfileController::class, 'show'])
->middleware(['auth', 'throttle:60,1']);
});
实际执行顺序为:web → auth → throttle → 控制器方法逻辑。
如何查看某条路由最终的 Middleware 数组
可在调试时直接获取:
$route = Route::getRoutes()->getByName('profile.show');
$middleware = $route->middleware(); // 返回已排序的中间件类名数组
或者使用 Artisan 命令快速查看:
php artisan route:list --columns=uri,name,method,middleware
注意:输出中的 Middlewares 列即为该路由最终生效的有序中间件列表(不含全局中间件),若需完整链路,还需叠加 Kernel 中定义的全局栈。
自定义 Pipeline 执行顺序的注意事项
如果通过 pipe() 手动构建 pipeline(如策略校验、API 统一处理),务必确保中间件 handle() 方法中正确调用 $next($request),否则后续中间件会被跳过。另外:
- 中间件构造函数中不能依赖请求数据(此时 request 尚未传入)
- 前置中间件适合做鉴权、日志、跨域;后置中间件适合做响应修改、缓存封装
- 使用
terminate()方法的中间件会在响应发送后异步执行,不参与主 pipeline 排序











