Laravel嵌套资源路由未校验子模型归属父模型问题求助
Laravel 8 嵌套资源父子归属校验实现方法
方案1:使用内置路由作用域绑定(推荐,代码量最少)
Laravel 8 已经原生支持嵌套资源的自动归属校验,只需要给嵌套资源路由添加scoped()方法即可:
Route::resource('locations', LocationController::class); Route::resource('locations.contents', ContentController::class)->scoped();
前置要求
确保Content模型已经定义了指向Location的关联方法:
// app/Models/Content.php public function location() { return $this->belongsTo(Location::class); }
配置完成后,Laravel会自动校验子资源是否属于传入的父资源,匹配失败时直接返回404页面,不需要写额外的业务逻辑。
方案2:控制器手动校验
如果只需要个别接口做校验,也可以直接在控制器方法中手动判断:
// app/Http/Controllers/ContentController.php public function show(Location $location, Content $content) { // 校验归属关系 if ($content->location_id !== $location->id) { abort(404); } // 后续正常业务逻辑 }
你可以按需给show、edit、update、destroy这类需要校验的方法都加上这段判断逻辑即可。
方案3:中间件统一校验
如果项目中有多个嵌套资源都需要这类校验,可以封装通用中间件全局处理,避免重复编码。
注意事项
- 如果你的子资源路由不是用
id作为查询字段,而是用slug等自定义字段,可以在scoped方法中指定字段映射:->scoped(['content' => 'slug']) - 关联方法名需要和父资源的路由片段对应,本场景父资源路由片段是
locations,对应子模型的关联方法名要写为location,Laravel会自动识别复数和单数的对应规则。
内容的提问来源于stack exchange,提问作者Sachin Kumar
相关产品推荐
相关产品推荐

