Laravel 6中Route Model Binding失效问题求助
问题排查:Laravel 6路由模型绑定在index方法中失效的原因及解决
我来帮你理清楚这个问题——你遇到的问题本质是对Laravel路由模型绑定的适用场景理解错了,咱们一步步拆解:
核心原因:路由资源的index方法没有路由参数
当你定义Route::resource('accommodation', 'AccommodationController')时,Laravel会自动生成7个资源路由,其中index方法对应的路由是GET /accommodation,没有任何路由参数。
而路由模型绑定的工作逻辑是:Laravel会从URL的路由参数(比如{accommodation})中提取值,然后自动查询对应的Accommodation模型实例。但index路由没有这个参数,Laravel找不到要查询的标识(比如ID),自然会抛出异常(通常是ModelNotFoundException或者直接返回404)。
正确的用法场景
路由模型绑定只适用于需要操作单个模型实例的资源方法,也就是那些路由中带有{accommodation}参数的方法:
show:展示单个住宿详情edit:编辑单个住宿update:更新单个住宿destroy:删除单个住宿
举个正确使用模型绑定的例子(比如show方法):
public function show(Accommodation $accommodation) { // Laravel已经自动根据路由参数{accommodation}查询到了对应的模型实例 return view('admin.accommodations.show', compact('accommodation')); }
而index方法的作用是返回所有住宿的列表,你不需要单个模型实例,所以应该保持原来的写法(还可以优化变量名的语义):
public function index() { $accommodations = Accommodation::get(); return view('admin.accommodations.index', compact('accommodations')); }
补充:Laravel 6资源路由对应表
为了更清晰,我把资源路由的各个方法对应的路由结构列出来:
| 控制器方法 | 路由URI | 路由名称 | 是否带路由参数 |
|---|---|---|---|
| index | GET /accommodation | accommodation.index | 否 |
| create | GET /accommodation/create | accommodation.create | 否 |
| store | POST /accommodation | accommodation.store | 否 |
| show | GET /accommodation/{accommodation} | accommodation.show | 是 |
| edit | GET /accommodation/{accommodation}/edit | accommodation.edit | 是 |
| update | PUT/PATCH /accommodation/{accommodation} | accommodation.update | 是 |
| destroy | DELETE /accommodation/{accommodation} | accommodation.destroy | 是 |
总结
简单来说:
- 要获取列表数据:用index方法,自己查询模型集合,不要用模型绑定
- 要操作单个实例:用show/edit/update/destroy方法,这些方法的路由带参数,可以放心用模型绑定
内容的提问来源于stack exchange,提问作者Зоран Шефот Богоевски
相关产品推荐
相关产品推荐

