Laravel路由模型绑定:检查路由参数模型

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'; 
} 
+0

404是问题: -/myurl.com/somecontroller怎么样 - 我能想到的唯一的事情是,我设置了我作为最后一条路线发布的路线,但也不是很优雅.. – sugo

+0

什么当用户输入一个以不存在的国家/地区开头的网址时,您是否希望发生? – jackel414

+0

正如我所说的,我希望这条路线能够活跃起来,当国家存在时(没有前缀,{country}位于域根目录中)。所以当有人访问myurl.com/thiscountrydoesnotexist时,不应该应用该路线。 – sugo

在我看来,你可以通过国家作为模型你的控制器。如果你的数据库中没有这样的模型,Laravel会产生404错误。