我目前有嵌套路线。
假设我有
Route::resource('a', 'AController');
Route::resource('a.b', 'BController');
Route::resource('a.b.c', 'CController');
在我看来,有比生成URL更好的方法了:
route('a.b.c.show', ['a'=>$aId, 'b'=>$bId, 'c'=>$cId])
嵌套网址变得有点烦人了。为什么我们不能仅仅传递一个雄辩的模型实例?像route('a.b.c.show', $cInstance)
谢谢
答案 0 :(得分:1)
我经常将生成网址的责任传递给模型,例如与吸气剂:
$cInstance->url
public function getUrlAttribute() {
return route('a.b.c.show', $this);
// or:
// return action([CController::class, 'show'], ['a' => $this]);
}
但这取决于您的用例。普通方法也可以正常工作,就像您要添加比模型已经知道的更多的参数一样。例如:
public function url($b, $c) {
return route('a.b.c', ['a' => $this, 'b' => $b, 'c' => $c]);
}
但是,如果您要谈论的只是在使用模型之前从模型获取ID,例如这种情况:
$aId = $a->id;
return route('a', ['a' => $aId]);
然后Laravel实际上 已经支持:route('a.b.c.show', compact('a', 'b', 'c'))
应该可以正常工作。雄辩的模型实现了Illuminate\Contracts\Routing\UrlRoutable
接口,该接口具有路由器知道如何使用的getRouteKey()
方法。