Laravel 5.7:在视图中生成嵌套URL的最干净方法

时间:2019-02-10 13:58:12

标签: php laravel routes

我目前有嵌套路线。

假设我有

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)

谢谢

1 个答案:

答案 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()方法。