2017-04-02 16 views
0

我從Laravel路線如下代碼:Laravel 5.4 - 如何在路線中設置可選參數。如果它存在必須是「家」字?

Route::group(['prefix'=>'{account}'], function(){ 

    Route::group(['prefix'=>'{location}'], function(){ 

     Route::get('/{home?}', function ($account,$location) { 
      $loc=explode("_", $location); 
      $locale = $loc[0]; 
      $country= $loc[1]; 
      App::setLocale($locale); 
      return view('homeProfPublic')->with(['account' => $account,'active' => 'home','locale'=>$locale,"country"=>$country]); 
     })->where('home', '/home/'); 
    }); 
}); 

我想這條路追趕:

  1. mysite.com/bob/US_en
  2. mysite.com/bob/US_en/
  3. mysite.com/bob/US_en/home

換句話說,我想這個詞「家」是可選的,但如果是那裏,只有「家」這個詞。所有previuos路線應重定向到主頁。

  1. mysite.com/bob/US_en/contact //應該重定向到聯繫頁面。

我怎樣才能完成這個任務?

回答

0

你不希望這樣做的路由本身。

退房通過創建和應用路線中間件其處理您的本地化像laravel-localization包如何處理這個問題,。 中間件將處理設置地方,你可以創建一個服務來回報基於網址,例如第一部分的帳戶。這消除了在你的路線中有這個邏輯的需要。

你現在正在使用的是,你使用可選的家庭參數的值,你實際上只是想定義2路線(//home)給出相同的輸出。

對於路線,我建議建立一個控制器動作來處理顯示視圖,並設置你的路由調用控制器動作而不必在你的路由文件這個邏輯的。這消除了重複代碼的需要。

例如(使用漢化包)

Route::group(
[ 
    'prefix' => LaravelLocalization::setLocale(), 
    'middleware' => [ 'localeSessionRedirect', 'localizationRedirect' ] 
], 
function() 
{ 
    Route::get('/', '[email protected]'); 

    Route::get('contact', '[email protected]'); 

    // add catchall as the last route in the group 
    Route::get('{any}', '[email protected]')->where('any', '.*'); 
}); 

這將使/contact顯示聯繫人頁面,和其他一切會給[email protected]控制器動作的輸出。

說實話,我會重新考慮,而不是顯示在一個不存在的網址404的重新定向到家庭。如果事情不存在,不存在:)

Route::group(
[ 
    'prefix' => LaravelLocalization::setLocale(), 
    'middleware' => [ 'localeSessionRedirect', 'localizationRedirect' ] 
], 
function() 
{ 
    Route::get('/', '[email protected]'); 
    Route::get('home', '[email protected]'); 

    Route::get('contact', '[email protected]'); 
}); 
相關問題