来自路由的Symfony2全局和可选区域设置检测

Nin*_*inj 15 locale url-routing symfony-2.1

这就是我想要实现的目标,然后汇编我获得的知识,没有解决方案.

在Symfony2项目中,不使用专用包,我希望路径中的第一个目录定义语言环境.它必须是可选的:

由于我将在项目结束时拥有超过100条路由,并且考虑到可以随时添加区域设置,我需要将所有区域设置路由仅写入一次.

没有机会用一个路由文件实现这一点.SF2.1的一个有趣的解决方案是链式路由文件,由Fabien Potencier自己解释:一个文件将语言环境和链接作前缀到正常路由.我们到了:

第一个文件列出了非语言环境感知的路由以及链接到所有其他正常路由的语言环境感知路由文件.

- routing.yml:

sys_ajax:
  resource: "@SystemAjax/InternalAjax/get"
  prefix:   /sysajax

locale_routing:
  resource: base_routing.yml
  prefix: /{_locale}
  defaults:
    _locale: fr
Run Code Online (Sandbox Code Playgroud)

- base_routing.yml:

user:
  resource: "@UserBundle/Resources/config/routing.yml"
  prefix:   /user
Run Code Online (Sandbox Code Playgroud)

@ BTUserBundle/Resources/config/routing.yml是一个普通的捆绑路由文件.

好的,这适用于路径中具有区域设置的URL(示例2和3),但如果我删除了可选的区域设置部分(示例1),则找不到路由.很容易猜到问题来自{_locale}令牌,当URL中没有区域设置字符串时,将URL的"用户"部分捕获为区域设置.但是,如果URL的第一部分不是en | fr | it | de,那我该怎么告诉它让URL解开并将它链接到下一个文件?

论坛的解决方案是制作2条路线:

- routing.yml:

sys_ajax:
  resource: "@SystemAjax/InternalAjax/get"
  prefix:   /sysajax

locale_routing:
  resource: base_routing.yml
  prefix: /{_locale}
  requirements:
    _locale: fr|en

locale_routing2:
  resource: base_routing.yml
  prefix: /
  defaults:
    _locale: fr
Run Code Online (Sandbox Code Playgroud)

一个规则有locale部分,一个没有.不幸的是,这不起作用,因为有两倍的线resource: base_routing.yml(每个规则一个),后者覆盖前者.

我在这里,没有好的解决方案......

我喜欢Symfony(自2008年以来),但有时我只是惊讶于简单的问题如何需要使用这个框架的非常复杂的解决方案.

小智 -1

您始终可以从另一个方向解决它,并使用带有宏的体面编辑器来编写路由文件。几乎不需要任何体力劳动,您就会实现您想要的。使用正则表达式替换和/或宏修改它会很简单。