Laravel依赖注入先于中间件执行的问题及合理性咨询
问题解答
为什么路由组中间件没先执行?
Laravel的路由模型绑定由SubstituteBindings中间件负责,这个中间件默认会在路由组中间件之前执行。请求的实际执行顺序是:
全局中间栈 → SubstituteBindings → 路由组中间件 → 控制器方法
所以当模型绑定失败(找不到对应记录)时,SubstituteBindings会直接抛出404异常,导致路由组中间件根本没机会运行。
你的做法是否正确、有必要?
把中间件通过$middleware->api(prepend: [MyMiddleware::class])加到全局API前置中间件的做法是可行的,但要不要这么做取决于中间件的职责:
- 如果这个中间件是所有API请求都必须执行的逻辑(比如全局请求日志、基础权限校验、请求头初始化),那这么做完全合理,能确保它在所有环节之前运行。
- 如果中间件只是针对该路由组的业务逻辑,那全局前置就没必要了——这会让所有API请求都走这个中间件,增加不必要的性能开销。
更合适的替代方案
如果只想让这个中间件在目标路由组的模型绑定前执行,不用放到全局中间件,可以调整中间件优先级:
在app/Http/Kernel.php里找到$middlewarePriority数组,把MyMiddleware::class放到SubstituteBindings::class的前面,示例代码如下:
protected $middlewarePriority = [ \App\Http\Middleware\MyMiddleware::class, \Illuminate\Routing\Middleware\SubstituteBindings::class, // 其他中间件... ];
这样即使是路由组里的中间件,也会在SubstituteBindings之前执行,就能避免模型绑定异常跳过中间件的问题。
内容的提问来源于stack exchange,提问作者Riza Khan
相关产品推荐
相关产品推荐

