Symfony2路由多语言网站

时间:2014-06-13 10:50:05

标签: php symfony

我的多语言网站存在路由问题。这里是routing.yml(仅适用于一个捆绑,但其他捆绑包相同)

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() twig方法,该方法为上述路径控制的导航提供链接。它只为英文版创建路径。我认为它是最后一个,所以当我为德语设置路线时,它将为该路线生成路径。由于路径名为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路由的目的无效。

有没有人对如何处理这个问题有任何想法?

1 个答案:

答案 0 :(得分: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