You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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路由名称是否带路由参数
indexGET /accommodationaccommodation.index否
createGET /accommodation/createaccommodation.create否
storePOST /accommodationaccommodation.store否
showGET /accommodation/{accommodation}accommodation.show是
editGET /accommodation/{accommodation}/editaccommodation.edit是
updatePUT/PATCH /accommodation/{accommodation}accommodation.update是
destroyDELETE /accommodation/{accommodation}accommodation.destroy是

总结

简单来说:

  • 要获取列表数据:用index方法,自己查询模型集合,不要用模型绑定
  • 要操作单个实例:用show/edit/update/destroy方法,这些方法的路由带参数,可以放心用模型绑定

内容的提问来源于stack exchange,提问作者Зоран Шефот Богоевски

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.06 11:22:44