2013-02-05 192 views
0

我使用PHP 5.5和3.3的KohanaKohana的路由(和重路由)問題

我開發一個網站結構總是有用戶爲URI的第一個「項目」的語言首選項。

例如:

mydomain.com/en/products mydomain.com/de/store

現在,我相信有些用戶會嘗試聰明和類型的東西,如:

mydomain.com/products

這是很好的,我只是想讓他們重新路由到

mydomain.com/en/products保持一切。

只要uri在URI中只有一個「目錄」,我就可以使用下面的代碼,例如:

mydomain.com/products

mydomain.com/store

但不喜歡的URI進一步下跌的子目錄,如:

mydomain.com/products/something mydomain.com/store/purchase/info

這裏是我的路線:

Route::set('home_page', '(<lang>)') 
    ->defaults(array(
     'controller' => 'Index' 
    )); 

Route::set('default', '(<lang>(/<controller>(/<action>(/<subfolder>))))') 
    ->defaults(array(
     'controller' => 'Index', 
     'action' => 'index' 
    )); 

這裏是我的父控制器的代碼,所有其他控制器繼承:

public function before() 
     {   
      $this->uri = $this->request->uri(); 

      $this->lang = $this->request->param('lang'); 

      //If user directly inputted url mydomain.com without language information, redirect them to language version of site 
      //TODO use cookie information to guess language preferences if possible 
      if(!isset($this->lang)) 
      { 
       $this->redirect('en/', 302); 
      } 

      //If the first part of path does not match a language redirect to english version of uri 
      if(!in_array($this->lang, ContentManager::getSupportedLangs())) 
      { 
       $this->redirect('en/'.$this->uri, 302); 
      } 
      } 

回答

1

你可以替換給出的兩條路線這一個:

Route::set('default', '(<lang>/)(<controller>(/<action>(/<subfolder>)))', 
array(
    'lang' => '(en|fr|pl)' 
)) 
->defaults(array(
    'controller' => 'Index', 
    'action' => 'index' 
)); 

其中字符串(EN | | pl)是您支持的語言的連接,即'('.implode('|', ContentManager::getSupportedLangs()).')'

如果此解決方案仍不清楚,我很高興來解釋比較詳細,但我希望你可以反映出你的問題的出現是因爲你的第一路線,home_page,正在通過例如匹配看mydomain.com/products

您的控制器的before()函數也應該修改。重定向無法正常工作,因爲您最終將重定向到例如en/ru/Index。那麼,爲什麼不保持它簡單和使用:

public function before() 
    {   
     $default_lang = 'en'; 
     $this->lang = $this->request->param('lang', $default_lang); 
    } 
+0

當用戶沒有指定一個郎(url,en,fr或pl)時,這不會提供404嗎?我想採用url'/ products/something'並將它們路由到'/ en/products/something'。我希望用戶完全不知道他們必須在url中指定一種語言,如果他們在地址欄中輸入地址 – thatidiotguy

+0

否它不會提供404:嘗試它!原因是路由中的( /)'中的括號使該部分可選。因此,如果找不到支持語言的匹配,就會將它視爲不在那裏。 – Jonathan

+0

當然你是對的。對不起,我剛剛開始試用。非常感謝您的建議。 – thatidiotguy