2015-11-05 43 views
2

我用symfony 2.事情下面的問題是,我有在一開始就_locale參數例如幾個路由定義:Symfony的2問題與路由和_locale參數

/** 
* @Route("/{_locale}") 
* @Route("/{_locale}/community") 
* @Route("/{_locale}/events") 
*/ 

現在,_locale參數的默認值爲en-US,因此一旦站點區域設置爲en-US,它就不會顯示在url上。

我有另一條路線,這將改變應用程序的語言環境,

/** 
* @Route("/change-locale/{locale}", name="change_locale") 
*/ 

我需要以請求重定向到引用站點路由名稱設置爲區域設置參數,以獲得引薦路線名稱新的區域設置。我使用路由器服務match()方法來獲取引用者url的路由名稱。

現在例如。

如果引薦網址是/ EN-US /社區

然後使用匹配方法獲得傾倒路線:

'_locale' = 'en-US' 
    '_route' = 'app_frontend_main_default_index_1' 

哪個是正確的,但如果語言環境是默認語言環境(如:ES-ES),則甩路線如下:

'_locale' = '/community' 
    '_route' = 'app_frontend_main_default_index' 

哪項是錯誤的,因爲URL匹配到另一條路線,以及區域設置(這是默認值)獲得第一的價值部分路線。

我需要的是得到正確的路徑名,同時考慮在默認的語言環境參數。

在此先感謝。

回答

1

你要添加額外的路線:

/** 
* @Route("/", defaults={"_locale" = "en-US"}) 
* @Route("/community", defaults={"_locale" = "en-US"}) 
* @Route("/events", defaults={"_locale" = "en-US"}) 
*/ 

,然後添加requirements現有:

/** 
* @Route("/{_locale}", requirements={"_locale": "en-US|en|fr"}) 
* @Route("/{_locale}/community", requirements={"_locale": "en-US|en|fr"}) 
* @Route("/{_locale}/events", requirements={"_locale": "en-US|en|fr"}) 
*/ 

在這種情況下,你將能夠同時處理/community/en-US/community路線。

+0

工作順利,但您不認爲路由器服務的匹配方法應考慮到默認參數嗎? – asolenzal

+0

至於我最好直接定義所有路線,不要有任何魔法。作爲一個選項,您可以使用[「sticky」](http://symfony.com/doc/currentbook/session/locale_sticky_session.html)語言環境偵聽器,它將語言環境(從語言首選項或geoip接收)添加到會話和一個主要控制器處理所有不帶'{_locale}'參數的路由並重定向到所需的語言環境。在這種情況下,不需要爲每個路由設置'/ {_ locale}'前綴,因爲您可以在'routing.yml'文件中定義一次前綴。 – chapay

+0

是的,沒錯,但是會話較少的應用程序,我使用Symfony作爲休息後端。 – asolenzal