下面是我想要达到的,后面是我所获得的知识的汇编,无解。
在 Symfony2 项目中,不使用专用 bundle,我希望路径中的第一个目录来定义语言环境。它必须是可选的:
- 1. http://www.example.com/user/account => 默认EN语言环境、用户包、帐户控制器、默认索引操作。
- 2. http://www.example.com/fr/user/account => 强制FR语言环境...
- 3. http://www.example.com/en/user/account => 强制EN语言环境(需要选项,即使 EN 是默认语言环境)
由于在项目结束时我将有超过 100 条路由,并且考虑到可以随时添加语言环境,我需要只编写一次所有语言环境路由。
没有机会通过一个路由文件来实现这一目标。SF2.1 中一个有趣的解决方案是链式路由文件,Fabien Potencier 自己解释说:一个文件将语言环境和链作为正常路由的前缀。我们到了:
第一个文件列出了所有其他普通路由的非区域感知路由和指向区域感知路由文件的链。
--路由.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 保持不变并将其链接到下一个文件?
来自论坛的解决方案是制作 2 条路线:
--路由.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 年以来),但有时我只是惊讶于简单的问题可以使用这个框架需要非常复杂的解决方案。