2017-02-17 128 views
1

存在我有這樣的路線: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' 
]); 

但是,正如我所說,我會每次添加一個新的國家數據庫的時間來改變正則表達式。

回答

2

這裏是我的解決方案現在:

在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')) 
]); 
0

正如你所建議的,路線模型綁定可能是你最好的選擇。您可以從文檔中看到,如果您綁定到路線的模型不存在,路線將返回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

0

在我看來,你可以通過國家作爲模型你的控制器。如果你的數據庫中沒有這樣的模型,Laravel會產生404錯誤。