在 Symfony 2 中使用路由设置默认语言环境
Set default locale with routing in Symfony 2
我在 routing.yml
中配置我的主要路线是这样的:
geekhub_main:
resource: "@GeekhubMainBundle/Resources/config/routing.yml"
prefix: /{_locale}
defaults: { _locale: en }
requirements:
_locale: en|uk
如此处所述Symfony2 docs,但是当我去访问一些没有语言环境的页面时,比如
example.com/posts
而不是 example.com/en/posts
我收到关于 No route found for ...
的错误
那我哪里做错了?
这里有一个相关的 post Whosebug post,但我想 defaults
比 _locale: |en|uk
好多了?
如您在文档中所见:
Of course, you can have more than one optional placeholder (e.g.
/blog/{slug}/{page}), but everything after an optional placeholder
must be optional. For example, /{page}/blog is a valid path, but page
will always be required (i.e. simply /blog will not match this route).
如果您将 _locale
作为前缀,路由器将要求您始终添加它(即使您添加了默认值)。
如果您的路由不是前缀,而是如下所示:
_test:
path: /test/{_locale}
defaults: { _controller: AcmeDemoBundle:Demo:contact, _locale: en }
requirements:
_locale: en|uk
/test
可以,/test/en
可以。
因此,使用前缀,我认为更好、更优雅的方法是定义多个模式:
_test:
path: /test
defaults: { _controller: AcmeDemoBundle:Demo:contact, _locale: en }
_test_:
path: /{_locale}/test
defaults: { _controller: AcmeDemoBundle:Demo:contact}
requirements:
_locale: en|uk
test
可以,/en/test
也可以。
解决方案:
requirements:
_locale: |en|uk
不是一个好的选择,因为 //test
将是一个有效的 URL。
我在 routing.yml
中配置我的主要路线是这样的:
geekhub_main:
resource: "@GeekhubMainBundle/Resources/config/routing.yml"
prefix: /{_locale}
defaults: { _locale: en }
requirements:
_locale: en|uk
如此处所述Symfony2 docs,但是当我去访问一些没有语言环境的页面时,比如
example.com/posts
而不是 example.com/en/posts
我收到关于 No route found for ...
那我哪里做错了?
这里有一个相关的 post Whosebug post,但我想 defaults
比 _locale: |en|uk
好多了?
如您在文档中所见:
Of course, you can have more than one optional placeholder (e.g. /blog/{slug}/{page}), but everything after an optional placeholder must be optional. For example, /{page}/blog is a valid path, but page will always be required (i.e. simply /blog will not match this route).
如果您将 _locale
作为前缀,路由器将要求您始终添加它(即使您添加了默认值)。
如果您的路由不是前缀,而是如下所示:
_test:
path: /test/{_locale}
defaults: { _controller: AcmeDemoBundle:Demo:contact, _locale: en }
requirements:
_locale: en|uk
/test
可以,/test/en
可以。
因此,使用前缀,我认为更好、更优雅的方法是定义多个模式:
_test:
path: /test
defaults: { _controller: AcmeDemoBundle:Demo:contact, _locale: en }
_test_:
path: /{_locale}/test
defaults: { _controller: AcmeDemoBundle:Demo:contact}
requirements:
_locale: en|uk
test
可以,/en/test
也可以。
解决方案:
requirements:
_locale: |en|uk
不是一个好的选择,因为 //test
将是一个有效的 URL。