2014-02-28 78 views
3

海蘭我有這個http://laravel.io/bin/jaPBLaravel路線起craizy

的問題是,當我去: domain.com - >它所服務的主頁(至極是確定) domain.com/foo - >它供應子頁(還OK

但是當我從那些一去: domain.com/en - >它給出了一個錯誤(也不行

但點擊刷新後確定。

所以,當我再次刷新後domain.com/en第一次錯誤很確定 同去刷新確定後,子頁像domain.com/en/contact第一次錯誤

我想指出的是,錯誤說,它第一次嘗試去PublicPageController @子頁面 但這不應該發生,當我去的domain.com/en它應該需要去PublicPageController @首頁

任何想法? 謝謝大家。

回答

2

我在這裏看看你設置基於語言環境的路由的方式,因爲Session::get('urilang)沒有在你第一次訪問時設置,因此錯誤,並且只有在你去過某個頁面後纔會設置第一。

現在,我還沒有處理多語言網站,但據我所知,你這樣做的方式不是正確的方式。相反,將lang鍵作爲URI參數來考慮,並使用過濾器來驗證並設置路由。東西有點像下面的代碼:

// Main and subpage - not default language 
Route::group(array('prefix' => '{lang}', 'before' => 'detectLanguage'), function() { 
    Route::get('', '[email protected]'); 
    Route::get('{slug}', '[email protected]'); 
}); 

// Main and subpage - default language 
Route::group(array('before' => 'setDefaultLanguage'), function() { 
    Route::get('/', '[email protected]'); 
    Route::get('/{slug}', '[email protected]'); 
}); 

Route::filter('detectLanguage', function($route, $request, $response, $value){ 
    // hopefully we could do something here with our named route parameter "lang" - not really on sure the details though 

    // set default 
    $locale = 'hu'; 
    $lang = ''; 

    // The 'en' -> would come from db and if there is more i would of corse use in array 
    if (Request::segment(1) == 'en') 
    { 
     $lang = 'en'; 
     $locale = 'en'; 
    } 

    App::setLocale($locale); 
    Session::put('uriLang', $lang); 
    Session::put('locale', $locale); 
}); 


Route::filter('setDefaultLanguage', function($route, $request, $response, $value){ 
    App::setLocale('hu'); 
    Session::put('uriLang', ''); 
    Session::put('locale', 'hu'); 
}); 

我不知道你是否能在Route::group前綴使用段變量,但你肯定應該有一搏,因爲它會是最有用的。

也就是說,我不建議設置模仿特定語言路線但沒有語言段的默認語言路線。如果我是你,我會設置一個特殊的根路由,重定向到/{defaultlang}/,這樣你的路由問題就會減少。

+1

感謝您的幫助,您的代碼看起來非常酷,但我只有一個問題。除了domain.com/en/foo以外的所有內容都可以使用因爲那裏的PublicPageController認爲slug是「en」。任何想法?哦,我要編輯代碼,因爲有一些錯別字 –

+0

解決了它,但它並不是那麼幹淨,我同意你的一切,謝謝你的幫助人,真的拯救了我的一天。 –

+1

爲編輯而歡呼,我想我有點匆忙,一個出來,對不起。關於路線衝突的事情的好問題。如果我是誠實的,我不確定這個問題的確切方法(儘管據我瞭解,在另一條路線上註冊的路線與相同的URI相匹配會覆蓋它,所以你可以考慮在這裏逆轉訂單,但我認爲這會給你帶來另一個問題)。所以,這就是爲什麼我建議(在答案的最後)沒有雙路由系統 - 獲得一個系統並堅持下去,因爲它使事情變得不那麼瘋狂了。 – alexrussell