Laravel路由模型绑定:检查路由参数模型
问题描述:
存在我有这样的路线:Laravel路由模型绑定:检查路由参数模型
Route::get('{country}/{federalstate?}/{city?}', ['as' => 'regions.show', 'uses' => '[email protected]']);
接下来,我有一个模型,国家在这几个国家。
我希望此路线只有在模型国家/地区中存在{country}时才会生效。我想这样做,因为不要为该路线使用前缀。
丑陋的方式将是一个正则表达式。丑陋的,因为每次我添加一个新的国家模型时,我将不得不更新它。
那么完成我想要做什么的最好方法是什么?
也许这可能有帮助 - >https://laravel.com/docs/5.4/routing#route-model-binding - 但我是一个初学者,我不能得到它的工作。
编辑:
这可能工作:
Route::get('{country?}/{federalstate?}/{city?}', ['as' => 'regions.show', 'uses' => '[email protected]'])->where([
'country' => 'germany|usa|canada'
]);
但是,正如我所说,我会每次添加一个新的国家数据库的时间来改变正则表达式。
答
这里是我的解决方案现在:
在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' => '[email protected]'])->where([
'country' => implode('|', config('app.available_countries'))
]);
答
正如你所建议的,路线模型绑定可能是你最好的选择。您可以从文档中看到,如果您绑定到路线的模型不存在,路线将返回404.
请注意,Route-Model绑定中的默认功能需要来自URL的ID 。如果你想覆盖,你可以做到以下几点:
/**
* Get the route key for the model.
*
* @return string
*/
public function getRouteKeyName()
{
return 'name';
}
答
在我看来,你可以通过国家作为模型你的控制器。如果你的数据库中没有这样的模型,Laravel会产生404错误。
404是问题: -/myurl.com/somecontroller怎么样 - 我能想到的唯一的事情是,我设置了我作为最后一条路线发布的路线,但也不是很优雅.. – sugo
什么当用户输入一个以不存在的国家/地区开头的网址时,您是否希望发生? – jackel414
正如我所说的,我希望这条路线能够活跃起来,当国家存在时(没有前缀,{country}位于域根目录中)。所以当有人访问myurl.com/thiscountrydoesnotexist时,不应该应用该路线。 – sugo