我的url结构有以下要求。
/{category}.html
/{category}-color-{color}.html
/color-{color}.html
所有这些url都指向一个控制器,该控制器根据给定的过滤器信息生成我的目录项的过滤视图。除了提到的类别和滤色器之外,还有一些更多的前缀片段(例如length-12)和无前缀片段。后者具有不同的正则表达式模式。
所以我的问题是:有没有一种方法可以通过Symfony2中的单一路由来解决这个需求?
如果目前已经做了什么:
- 为每种可能的组合生成路线。
- 这很有效,但它给了我15条路线。添加更多的过滤器碎片将导致更多的路由
- 生成路径为
/{category}{color}{length}.html
的单个路由,并将前缀添加到需求中。- 那感觉有点脏。url
/color-red.html
在匹配中提供[color => 'color-red']
,因此前缀'color-'必须手动取消。另一方面,URL的生成需要我将前缀设置为值($router->generate('foo', ['color' => 'color-red']);
),因此在基于例如数据库信息生成URL时需要额外的步骤
- 那感觉有点脏。url
- 生成一个与所有组合匹配的独立正则表达式。
- 这也可以,但它没有使用路由组件,因此无法使用
$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
的新服务,扩展SymfonyComponentRoutingRouter
)。
然后使用能够匹配路线的解决方案2,而无需手动创建所有这些路线。
也许可以考虑将一条路线分成至少3条路线。秩序在这里很重要,因为第一条匹配的路线获胜。
/{category}-color-{color}.html
/color-{color}.html
/{category}.html