2015-11-05 30 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