首页 > 解决方案 > Laravel 5.7:在视图中生成嵌套 url 的最简洁方法

问题描述

我目前有嵌套路线。

假设我有

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])

嵌套网址有点烦人。为什么我们不能只传递一个 Eloquent 模型实例?喜欢route('a.b.c.show', $cInstance)

谢谢

标签: phplaravelroutes

解决方案


我经常将生成 url 的职责传递给模型,例如使用 getter:

$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'))应该可以正常工作。Eloquent 模型实现了Illuminate\Contracts\Routing\UrlRoutable接口,它有一个getRouteKey()路由器知道如何使用的方法。


推荐阅读