带有前缀可选值的Symfony2路由


Symfony2 Routes with prefixed optional values

我的url结构有以下要求。

/{category}.html

/{category}-color-{color}.html

/color-{color}.html

所有这些url都指向一个控制器,该控制器根据给定的过滤器信息生成我的目录项的过滤视图。除了提到的类别和滤色器之外,还有一些更多的前缀片段(例如length-12)和无前缀片段。后者具有不同的正则表达式模式。

所以我的问题是:有没有一种方法可以通过Symfony2中的单一路由来解决这个需求?

如果目前已经做了什么:

  1. 为每种可能的组合生成路线。
    • 这很有效,但它给了我15条路线。添加更多的过滤器碎片将导致更多的路由
  2. 生成路径为/{category}{color}{length}.html的单个路由,并将前缀添加到需求中。
    • 那感觉有点脏。url /color-red.html在匹配中提供[color => 'color-red'],因此前缀'color-'必须手动取消。另一方面,URL的生成需要我将前缀设置为值($router->generate('foo', ['color' => 'color-red']);),因此在基于例如数据库信息生成URL时需要额外的步骤
  3. 生成一个与所有组合匹配的独立正则表达式。
    • 这也可以,但它没有使用路由组件,因此无法使用$router->match()$router->generate()来处理url。模式是:
/^((?P<category>([a-z]+))('.html|-))?(length-(?P<length>([1-9][0-9]?))('.html|-))?(color-(?P<color>([a-z]+))'.html)?$/i

同样,有没有一种方法可以在不破坏$router->match()$router->generate()的情况下通过单一路线解决这个问题?感谢您的帮助。

将symfony的默认路由器服务替换为包含帮助函数或扩展generate()方法的扩展路由器服务(也就是定义一个名为@router的新服务,扩展Symfony'Component'Routing'Router)。

然后使用能够匹配路线的解决方案2,而无需手动创建所有这些路线。

也许可以考虑将一条路线分成至少3条路线。秩序在这里很重要,因为第一条匹配的路线获胜。

/{category}-color-{color}.html
/color-{color}.html
/{category}.html