【问题标题】:Symfony2 Routes with prefixed optional valuesSymfony2 带有前缀可选值的路由
【发布时间】:2013-11-19 14:28:17
【问题描述】:

我的 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() 的情况下用一条路线解决这个问题?任何帮助表示赞赏。

【问题讨论】:

    标签: php symfony routing


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 现在我正在覆盖 match()generate() 为特殊标记的路线( $route->setOption('is_filter', true))。最后我注意到我的单元测试中有一个错误。由于 RoutingCompiler 的编译规则,/{category}{color}{length}.html 路径不起作用。所以我最终编写了一个自定义编译器来处理我的需求。感谢您的提示!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-18
    • 1970-01-01
    • 2019-07-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多