2014-06-13 47 views
1

我有多語言站點的路由問題。這裏是routing.yml中(僅適用於一個包,但其他人都是一樣的)Symfony2路由多語言站點

icoo_pitanja_route: 
pattern: /{_locale}/najcesca-pitanja 
defaults: { _controller: IcooPitanjaBundle:Pitanja:pitanja, _locale:hr } 
requirements: 
    _locale: hr|en|de 

icoo_pitanja_route: 
pattern: /{_locale}/common-questions 
defaults: { _controller: IcooPitanjaBundle:Pitanja:pitanja, _locale:en } 
requirements: 
    _locale: hr|en|de 

啊,我的頁面的頂部,我有3個鏈接來更改語言克羅地亞(默認),英語和德語。製造環節改變他們的代碼是這樣的......

{% set requestParams = app.request.attributes.get('_route_params') %} 
    {% set requestRoute = app.request.attributes.get('_route') %} 
    <div class='languages col-xs-4'> 
     <a href="{{ path(requestRoute, requestParams|merge({'_locale' : 'hr'})) }}" class='col-xs-3'><span class='real-link'>croatian</span><span></span></a> 
     <a href="{{ path(requestRoute, requestParams|merge({'_locale' : 'en'})) }}" class='col-xs-3'><span class='real-link'>english</span><span>|</span></a> 
     <a href="{{ path(requestRoute, requestParams|merge({'_locale' : 'de'})) }}" class='col-xs-3'><span class='real-link'>deutch</span><span>|</span></a> 
    </div> 

真正的問題是在path()樹枝方法,使鏈接導航,上述路線的控制。它只爲英文版創建路徑。我認爲這是最後一個,所以當我爲德語添加一條路線時,它將生成該路線的路徑。由於路徑名icoo_pitanja_route對英語和克羅地亞的版本相同的路線名稱,path()定義是這樣的...

path('icoo_naslovna_route') 

我想要什麼,是當我點擊克羅地亞,該網址是WWW .example.com/hr/najcesca-pitanja,英語www.example.com/en/common-questions。但paht()方法選擇最後一個,英文。

現在,有幾種方法可以解決這個問題。其中之一就是爲每種語言製作不同的路線。另一種是讓它像這樣...

pattern: (_locale}/{language-specific-link} 

,並在每種語言的有效鏈接的陣列控制器處理它,然後,如果URL是有效的,返回正確的響應。如果沒有,拋出未發現的異常,但我認爲這使Symfony2路由的目的無效。

有沒有人有任何想法如何處理這個問題?

回答

3

因爲您的路線名稱相同。嘗試更改路由名稱,例如:

icoo_pitanja_route_hr: 
pattern: /{_locale}/najcesca-pitanja 
defaults: { _controller: IcooPitanjaBundle:Pitanja:pitanja, _locale:hr } 
requirements: 
    _locale: hr|en|de 

icoo_pitanja_route_en: 
pattern: /{_locale}/common-questions 
defaults: { _controller: IcooPitanjaBundle:Pitanja:pitanja, _locale:en } 
requirements: 
    _locale: hr|en|de 

然後更改相應的path函數調用。

這是必需的,因爲_locale參數是special

+0

是的,但文件指出,如果路線名稱相同,則第一個贏得勝利。那麼爲什麼這會成爲一個問題呢?另外,如果第一條路徑獲勝,爲什麼path()方法選擇最後一條創建鏈接。 –

+0

'_locale'參數是特殊的。您可能無法像您的示例中那樣顯式設置它。這由內部通過'getLocale()'方法填充。我希望你的請求目前包含'en'作爲語言環境,因此'en'路由。 –

+0

感謝您的回答。我將切換到您的實施 –