2014-06-13 46 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

感谢您的回答。我将切换到您的实施 –