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

时间:2012-11-13 10:15:13

标签: url-routing locale 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

- base_routing.yml:

user:
  resource: "@UserBundle/Resources/config/routing.yml"
  prefix:   /user

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

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

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

- 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

一个规则具有区域设置部分,一个规则没有。不幸的是,这不起作用,因为行resource: base_routing.yml的行数是两倍(每个规则一行),后者会覆盖前者。

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

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

1 个答案:

答案 0 :(得分:-1)

你总是可以从另一个方向处理它,并使用一个像宏的编辑器来编写路由文件。几乎没有任何体力劳动,你将实现你想要的。使用正则表达式替换和/或宏来修改它将很简单。