Laravel 11自定义路由文件中Route Model Binding失效求助
问题分析与解决方案
核心原因
Laravel 11的api路由组默认自动注册了SubstituteBindings中间件,这个中间件是路由模型绑定的核心逻辑载体。但你通过then闭包加载的admin.php路由组,并没有自动继承这个关键中间件,导致模型绑定流程无法触发,最终返回空的模型实例(打印显示为[])。
解决方法
方法1:给admin路由组手动添加SubstituteBindings中间件
修改bootstrap/app.php中的路由配置,在加载admin路由时显式绑定该中间件:
return Application::configure(basePath: dirname(__DIR__)) ->withRouting( api: __DIR__.'/../routes/api.php', apiPrefix: '', then: function () { Route::prefix('') ->middleware(\Illuminate\Routing\Middleware\SubstituteBindings::class) ->group(base_path('routes/admin.php')); }, ) ->withMiddleware(function (Middleware $middleware) { }) ->withExceptions(function (Exceptions $exceptions) { $exceptions->shouldRenderJsonWhen(fn() => true); }) ->create();
方法2:将admin路由纳入api路由集合
Laravel 11允许api参数接收数组,直接把admin.php加入api路由列表,这样会自动继承api组的所有默认中间件(包括SubstituteBindings):
return Application::configure(basePath: dirname(__DIR__)) ->withRouting( api: [ __DIR__.'/../routes/api.php', __DIR__.'/../routes/admin.php', ], apiPrefix: '', ) ->withMiddleware(function (Middleware $middleware) { }) ->withExceptions(function (Exceptions $exceptions) { $exceptions->shouldRenderJsonWhen(fn() => true); }) ->create();
额外说明
如果之前尝试用web参数加载admin路由,触发CSRF是因为web组默认启用了VerifyCsrfToken中间件。若要走web路由但关闭CSRF验证,可在admin路由组单独排除:
Route::prefix('') ->withoutMiddleware(\Illuminate\Foundation\Http\Middleware\VerifyCsrfToken::class) ->middleware(\Illuminate\Routing\Middleware\SubstituteBindings::class) ->group(base_path('routes/admin.php'));
但这种方式不如直接复用api组配置更适配后台接口场景。
内容的提问来源于stack exchange,提问作者Parastesh
相关产品推荐
相关产品推荐

