Laravel 9扩展包路由显式/隐式模型绑定失效问题
Laravel 9扩展包路由模型绑定失效修复方案
问题根因
隐式、显式路由模型绑定的解析逻辑,全部依赖Illuminate\Routing\Middleware\SubstituteBindings中间件执行。你在扩展包服务提供者中手动注册路由时,仅给路由组配置了api前缀,没有引入对应场景的中间件组,路由请求不会经过绑定解析中间件,因此控制器中$medium参数无法被自动注入模型实例,手动配置的Route::model显式绑定也不会生效。
修复步骤
修改扩展包服务提供者中的路由注册逻辑,给路由组匹配对应场景的官方中间件组即可,和应用原生路由运行环境保持一致:
public function boot() { Route::group([ 'prefix' => 'api', 'middleware' => 'api' // 引入默认api中间件组,已内置SubstituteBindings等必要中间件 ], function () { $this->loadRoutesFrom(__DIR__ . '/../routes/api.php'); }); }
修改完成后执行路由清缓存命令:
php artisan route:clear
原有控制器中的隐式绑定代码不需要做任何修改即可正常运行。
补充说明
- 如果扩展包路由用于web场景,将中间件参数替换为
web即可,不建议单独挂载SubstituteBindings中间件,直接使用官方封装好的中间件组可以避免遗漏cookie加密、请求参数校验等其他必要逻辑 - 你之前手动调用
Medium::find($id)可以正常运行,是因为该逻辑直接在控制器内执行,不依赖路由绑定中间件,和路由解析流程无关 - 只要模型本身可以正常执行数据库查询、命名空间引用路径正确,不需要对模型做额外配置
内容的提问来源于stack exchange,提问作者Kerkness
相关产品推荐
相关产品推荐

