嵌套资源需显式配置参数绑定、命名前缀和中间件,不能仅靠 route::resource() 套用;必须用 ->parameters() 或 route::model() 明确绑定规则,prefix 应扁平化书写,as 前缀需逐层拼接,route() 调用须传全且顺序匹配 uri 占位符。

嵌套资源不能靠 Route::resource() 套一层就完事,必须显式处理参数绑定、命名前缀和中间件叠加,否则生成的 URL 和模型注入都会出错。
Route::resource() 在 Route::group() 里必须手动配 parameters()
在 Route::group(['prefix' => 'admin']) 中直接写 Route::resource('users', UserController::class),Laravel 默认把参数名定为 {user},但实际 URL 是 /admin/users/{user}。问题来了:如果你的控制器方法是 show(User $user),它会按模型名找 route key;可一旦你加了软删除、或自定义了 getRouteKeyName(),$user 就可能为 null 或 404。
- 必须加
->parameters(['users' => 'user_id']),让 URL 变成/admin/users/{user_id} - 或者提前在
Route::model('user_id', User::class)注册绑定规则 - 别依赖隐式绑定自动推导上下文——
$user和$admin_user不会自动区分
嵌套多层时 prefix 别堆嵌套 group
Laravel 不支持 Route::group()->group() 这种链式嵌套语法。所谓“三层嵌套”,比如 api/v1/admin/users,不是靠三层 Route::group() 套出来,而是一层写清 prefix => 'api/v1/admin'。
- 写两层
Route::group()会让中间件顺序混乱、命名空间不继承、路由缓存难调试 -
as参数只作用于当前 group,as => 'api.v1.admin.'+name('users.index')才生成api.v1.admin.users.index - 超过 3 层 prefix(如
tenant/api/v2/admin)建议拆到子域名或独立服务,别硬塞进一个路由文件
调用 route() 时必须传全参数,顺序不能错
像 Route::get('evaluation/{evaluation}/trial/{trial}', ...)->name('trial.show') 这种嵌套资源,route('trial.show', [$evaluation->id, $trial->id]) 是唯一安全写法。漏一个、换顺序、传模型实例但没重载 getRouteKey(),都会触发 Missing required parameter 错误。
- 参数顺序必须和 URI 模板中占位符顺序完全一致:
{evaluation}在前,{trial}在后 - 推荐传模型实例(
[$evaluation, $trial])而非 ID,避免主键类型变更(如切 UUID)时全量改模板 - 在 Livewire 或 Blade 中确认
$evaluation已在作用域内——mount() 注入或 with() 传递不牢靠时,先@isset($evaluation)再调用
最常被忽略的是:嵌套资源的命名前缀(as)和参数绑定(parameters())必须同步设计,光改路由不改控制器签名,或光改 name() 不清缓存,php artisan route:list 看起来对,运行时照样崩。











