Symfony2路由带有前缀可选值

时间:2013-11-19 14:28:17

标签: php symfony routing

我的网址结构有以下要求。

/{category}.html

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

/color-{color}.html

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

所以我的问题是:在Symfony2中有没有办法用单一路由解决这个问题?

如果当前已完成该怎么办:

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

    同样,有没有办法通过一条路线解决这个问题而不会破坏$router->match()$router->generate()?任何帮助表示赞赏。

1 个答案:

答案 0 :(得分:1)

将symfony的默认路由器服务替换为包含辅助函数或扩展@router方法的扩展服务器(也称为扩展Symfony\Component\Routing\Router的新服务,名称为generate())。

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

也许考虑将一条路线分成至少3条路线。在第一条匹配的路线获胜时,订单很重要。

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