在 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 文档,但是当我去做一些没有语言环境的页面时,比如 example.com/posts而不是example.com/en/posts我收到有关No route found for ...的错误

那么我做错了什么?

这里有一个相关的帖子堆栈溢出帖子,但我想defaults_locale: |en|uk好得多?

正如您在文档中读到的:

当然,您可以有多个可选占位符(例如 /blog/{slug}/{page}),但可选占位符之后的所有内容 必须是可选的。例如,/{page}/blog 是有效的路径,但页面 将始终是必需的(即简单的/blog 将不匹配此路线)。

如果您将_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。