【问题标题】:Laravel 5.7 : Cleanest way to generate nested urls in viewsLaravel 5.7:在视图中生成嵌套 url 的最简洁方法
【发布时间】:2019-02-10 13:58:12
【问题描述】:

我目前有嵌套路线。

假设我有

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)

谢谢

【问题讨论】:

  • 这需要大量的知识才能让 laravel 知道如何从 c 中获取 a 和 b。

标签: php laravel routes


【解决方案1】:

我经常将生成 url 的责任交给模型,例如使用吸气剂:

$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() 方法,路由器知道如何使用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-11-10
    • 1970-01-01
    • 2011-04-23
    • 2018-05-05
    • 2021-07-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多