Laravel路线模型绑定:检查模型中是否存在路由参数



我有以下路线:

Route::get('{country}/{federalstate?}/{city?}', ['as' => 'regions.show', 'uses' => 'RegionsController@show']);

接下来,我有一个模特国家,其中有几个国家。

我希望这条路线只有在模型国家中存在{country}时才能生效。我想这样做,因为不要为该路线使用前缀。

丑陋的方式将是正则表达式。丑陋,因为我每次在模型中添加新国家时都必须更新它。

那么,完成我想做的事情的最佳方法是什么?

也许这可能会有所帮助 -> https://laravel.com/docs/5.4/routing#route-model-binding-但是我是初学者,我无法让它上班。

编辑:

这可能有效:

Route::get('{country?}/{federalstate?}/{city?}', ['as' => 'regions.show', 'uses' => 'RegionsController@show'])->where([
    'country' => 'germany|usa|canada'
]);

,但是,正如我所说,每次我在数据库中添加新国家时,我都必须更改正则。

现在是我的解决方案:

在boot()方法中的AppServiceProvider中:

$available_countries = Country::select('slug')->get();
$available_countries = $available_countries->toArray();
$tmp = array();
foreach ($available_countries as $country)
{
    $tmp[] = $country['slug'];
}
Config::set('app.available_countries', $tmp);

在我的路线文件中:

Route::get('{country?}/{federalstate?}/{city?}', ['as' => 'regions', 'uses' => 'RegionsController@index'])->where([
    'country' => implode('|', config('app.available_countries'))
]);

正如您建议的那样,路由模型绑定可能是您最好的选择。您可以从文档中看到,如果您绑定到路线的模型不存在,则该路线将返回404。

请注意,路由模型绑定中的默认功能期望URL具有ID。如果要覆盖这一点,则可以执行以下操作:

/**
 * Get the route key for the model.
 *
 * @return string
 */
public function getRouteKeyName()
{
    return 'name';
}

在我看来,您可以将country作为模型传递给您的控制器。如果您的数据库中没有此类模型,Laravel将产生404个错误。

最新更新