Laravel路由-区分具有相同格式的路由的最佳方法

问题描述 投票:0回答:1

说我有一个item的数据库,每个数据库都属于一个国家,县和城市。我希望有一条路线列出单个国家,县或城市中的所有items。每个国家/地区/城市都有一个条目,例如france表示要在URL中使用的France

我希望所有路线都具有相同的格式:/items-in-{slug},例如/items-in-france/items-in-paris

但是,slug可以是多个模型之一的子弹。对于这种情况最好的设置是什么?我可以想到3个主要选项:

  1. 将捕获所有匹配URL的单个路由,它将运行专门的RoutingController或类似名称,然后依次检查哪个Model slug代表并推广到正确的控制器方法(例如viewInCountry($slug)或[C0 ])
  2. 每种模型的一条路径,并对每条路径设置限制,使其仅接受一个现有的子弹(即,获取所有这些子弹并生成一个仅接受一个现有的子弹的regex
  3. 获取所有模型(国家/城市/县)并为每个模型生成一条路线

所有选项似乎都有些怪异,我想知道是否对此有更优雅的解决方案。

laravel routing
1个回答
0
投票

我会选择第二种选择,除了不要使用正则表达式来接受现有的子弹。相反,您可以编写自己的模型路由绑定解析逻辑,如“自定义解析逻辑”中提到的viewInCity($slug)。这样的事情可能可以解决问题:

here

或者,如果您愿意稍微调整网址,则可以为每个模型创建一个路由和一个控制器。这将需要您使用// Put this in your RouteServiceProvider.php public function boot() { parent::boot(); Route::bind('slug', function ($value) { $country = App\Country::where('slug', $value)->first(); if ($country !== null) { return $country; } $city = App\City::where('slug', $value)->first(); if ($city !== null) { return $city; } // Repeat for each model. // 404 in case no model has been matched. abort(404). }); } /items/france等网址。

© www.soinside.com 2019 - 2024. All rights reserved.