Laravel 5.5使用Route::resource时URL传参与路由命名异常问题
解决Laravel嵌套资源路由命名异常的问题
嘿,我刚碰到过类似的坑,咱们一步步把它搞定!
你遇到的Route [segments.show] not defined错误,根源在于嵌套资源路由的命名规则没搞对。Laravel默认会根据URL结构自动生成路由名称,但当路由嵌套在动态参数(比如{valuechain_id})后面时,自动生成的命名会乱掉,就出现了你说的名称是index而非segments.index的情况。
第一步:修正路由定义
把你原来的路由代码改成这样:
Route::resource('/maps/valuechains/{valuechain_id}/segments', 'BackOffice\SegmentController') ->names('segments');
这里做了两个关键调整:
- 去掉URL末尾的斜杠(Laravel路由不建议带末尾斜杠,会干扰命名生成逻辑)
- 用
->names('segments')明确指定所有资源路由的名称前缀,这样生成的路由就会是segments.index、segments.show、segments.create等完全符合你预期的命名。
第二步:确保视图传递正确的路由参数
因为这是嵌套路由,所有子资源的路由都必须带上父级的valuechain_id参数,比如:
- 跳转到详情页:
route('segments.show', ['valuechain_id' => $valuechain_id, 'segment' => $segment->id]) - 跳转到列表页:
route('segments.index', ['valuechain_id' => $valuechain_id]) - 跳转到创建页:
route('segments.create', ['valuechain_id' => $valuechain_id])
要是只传$segment->id,Laravel会找不到valuechain_id参数,同样会导致路由匹配失败,这点一定要注意!
第三步:验证路由是否正确生成
运行命令php artisan route:list,你应该能看到类似这样的路由条目:
| GET|HEAD | maps/valuechains/{valuechain_id}/segments | segments.index | BackOffice\SegmentController@index | web | | GET|HEAD | maps/valuechains/{valuechain_id}/segments/create | segments.create | BackOffice\SegmentController@create | web | | POST | maps/valuechains/{valuechain_id}/segments | segments.store | BackOffice\SegmentController@store | web | | GET|HEAD | maps/valuechains/{valuechain_id}/segments/{segment} | segments.show | BackOffice\SegmentController@show | web |
确认路由名称都是以segments.开头的,这样视图里的路由调用就不会再报错了。
另外,你的控制器index方法接收$valuechain_id的写法是完全正确的,继续保持就行,比如:
public function index($valuechain_id) { $segments = Segment::where('valuechain_id', $valuechain_id)->get(); return view('backoffice.segments.index', compact('segments', 'valuechain_id')); }
这样调整完,应该就能彻底解决你的路由命名问题啦!
内容的提问来源于stack exchange,提问作者davidvera
相关产品推荐
相关产品推荐

