laravel 10+中间件实际执行顺序由$middleware数组顺序和$middlewarepriority覆盖规则共同决定;前者定义全局中间件基础顺序(从上到下即请求进入顺序),后者对指定中间件强制重排,如authenticate可能被提至startsession后。

直接看 $middleware 数组顺序,再结合 $middlewarePriority 覆盖规则 —— 这是 Laravel 10+ 中间件实际执行顺序的唯二决定因素,其他“猜测”或“文档默认顺序”都不作数。
怎么看 app/Http/Kernel.php 里的 $middleware 数组
全局中间件的**基础顺序**就写在这里,从上到下就是请求进入时的执行顺序(洋葱模型外层→内层):
-
$middleware中靠前的类,如TrustProxies、HandleCors,会在所有其他全局中间件之前运行 - 你改了数组位置,Laravel 就真按这个顺序跑,不额外推理依赖关系
- 注意:路由中间件(比如
auth、throttle)不在此数组中,它们走另一套注册逻辑,但最终仍会被$middlewarePriority影响排序
为什么有时 $middleware 顺序“没生效”?查 $middlewarePriority
Laravel 会用 $middlewarePriority 对部分中间件做**强制重排**,尤其影响 web 路由组中的中间件。即使你把 Authenticate 写在 $middleware 最底下,只要它出现在 $middlewarePriority 数组里,就可能被提前到 StartSession 后面、CheckRole 前面执行。
-
$middlewarePriority不是“可选配置”,它是 Laravel 内部调度器的真实排序依据 - 常见高优先级类:
StartSession、ShareErrorsFromSession、Authenticate、ThrottleRequests - 自定义中间件如果没列进
$middlewarePriority,就完全按$middleware或路由绑定顺序执行;一旦列入,就会被“提权”插队
怎么验证当前请求到底走了哪些中间件、顺序如何
最可靠的方式不是猜,而是实测 —— 在关键中间件的 handle 方法里加日志或断点:
- 在
handle()开头加info('→ ' . static::class);,看日志输出顺序 - 别依赖
php artisan route:list --middleware,它只显示注册关系,不反映真实执行链 - 对
web路由,特别注意:即使没显式绑定StartSession,它也可能因$middlewarePriority自动插入到认证前 - 使用
dd()在$next($request)前后分别打点,能清晰看到洋葱模型的“进”和“出”两段
真正容易被忽略的是:Laravel 并不会报错提示“你把 Authenticate 放错了位置”,它只会静默地按 $middlewarePriority 重排——而这个数组在某些项目模板里可能被删掉或注释掉了,导致你以为的顺序和实际完全相反。











