在 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。