Url routing Symfony2路由全局和可选区域设置检测

Url routing Symfony2路由全局和可选区域设置检测,url-routing,locale,symfony-2.1,Url Routing,Locale,Symfony 2.1,以下是我想要实现的目标,然后是我所获得的知识的汇编,没有解决方案 在Symfony2项目中,不使用专用绑定,我需要路径中的第一个目录来定义区域设置。它必须是可选的: 1.=>默认语言环境、用户绑定、帐户控制器、默认索引操作 2.=>强制FR区域设置 3.=>强制EN语言环境(即使EN是默认语言环境,也需要此选项) 由于在项目结束时我将有100多条路由,并且考虑到可以随时添加区域设置,我需要所有区域设置路由只编写一次 没有机会用一个路由文件实现这一点。来自SF2.1的一个有趣的解决方案是链式路

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

在Symfony2项目中,不使用专用绑定,我需要路径中的第一个目录来定义区域设置。它必须是可选的:

  • 1.=>默认语言环境、用户绑定、帐户控制器、默认索引操作
  • 2.=>强制FR区域设置
  • 3.=>强制EN语言环境(即使EN是默认语言环境,也需要此选项)
由于在项目结束时我将有100多条路由,并且考虑到可以随时添加区域设置,我需要所有区域设置路由只编写一次

没有机会用一个路由文件实现这一点。来自SF2.1的一个有趣的解决方案是链式路由文件,Fabien Povertier自己解释道:一个文件将区域设置和链作为正常路由的前缀。我们到了:

第一个文件列出了非区域设置感知的路由和链,这些路由和链指向所有其他正常路由的区域设置感知路由文件

--routing.yml:

--base_routing.yml:

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

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

一个论坛的解决方案是制定两条路线:

--routing.yml:

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

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


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

您总是可以从另一个方向解决它,并使用一个带有宏的体面编辑器来编写路由文件。几乎没有任何体力劳动,你会达到你想要的。使用regex replace和/或宏来修改它将很简单。

不管多个URL具有相同的内容对SEO有什么坏处,我也对这个问题感兴趣:)我也在寻找解决这个问题的方法,不敢相信到目前为止还没有人想出任何办法。当然。。。但这并不是我最初帖子的深层目的。我写这篇文章的目的是为了解决你们能读到的问题,也为了提到我在这个奇妙的框架中有时会遇到的一般复杂性。在我看来,一个不处理如此明显的区域设置机制的路由机制需要改进。哦,我100%同意,它有时会使非常简单的事情变得非常复杂。这就是Java的世界。我说的是Java吗?我是说Symfony2:)
sys_ajax:
  resource: "@SystemAjax/InternalAjax/get"
  prefix:   /sysajax

locale_routing:
  resource: base_routing.yml
  prefix: /{_locale}
  defaults:
    _locale: fr
user:
  resource: "@UserBundle/Resources/config/routing.yml"
  prefix:   /user
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