目前,我正在尝试实现一些通往 symfony 2.5 的路线,这导致我遇到了一个小问题。我需要一个具有相同路由的 url 方案,具体取决于自定义服务。
route_category:
pattern: /{location}/{category}
defaults: { _controller: LocationBundle:Category:index }
condition: "service('location_category_service').isCategory(request.get('category')) == true"
route_merchant:
pattern: /{location}/{merchant}
defaults: { _controller: LocationBundle:Merchant:index }
condition: "service('location_merchant_service').isMerchant(request.get('merchant')) == true"
我希望 symfony 做的是:
给定的 URL 路径:/germany/restaurants
- 尝试匹配路线1
- “isCategory”返回true,所以这条路由匹配
给定的 URL 路径:/germany/aldi
- 尝试匹配路线1
- “isCategory”返回 false,所以我们跳过这条路线
- 尝试匹配路线2
- “isMerchant”返回 true,所以这条路由匹配,我们执行 MerchantController
给定的 URL 路径:/germany/this-does-not-match-anything
- 尝试匹配路线1
- “isCategory”返回 false,所以我们跳过这条路线
- 尝试匹配路线2
- “isMerchant”返回 false,所以我们跳过这条路线
- ...现在我们可以在没有路由匹配时执行默认行为
我想,条件完全符合我的要求,但我只有 requestContext 和表达式语言的请求,没有服务容器。
有谁知道,我如何将服务容器注入(inject)表达式语言以用于路由目的或可能有助于解决此问题的其他方法?
提前致谢:-)
最佳答案
像这样有两个变量很麻烦。根据经验,最佳做法是使用静态值将这两者分开,如下所示:
route_category:
pattern: /{location}/category/{category}
route_merchant:
pattern: /{location}/merchant/{merchant}
否则,正如 David Kmenta 所说,您将编写额外的代码来试图弄清楚什么是什么。
问问自己,这种类型的编码是否值得在您的网址中少一个额外的词?
除此之外,想想您的用户:如果您的商家听起来像一个类别,他们会知道其中的区别,还是您所采用的方案只会让他们感到困惑。
关于php - Symfony 2 - 在路由表达式中使用自定义服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29278700/