Symfony 2 - 在路由表达式中使用自定义服务

时间:2015-03-26 12:40:57

标签: php symfony routing

目前,我正在尝试实施一些到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做的是:

指定网址路径: / germany / restaurants

  • 尝试匹配路线1
  • " isCategory"返回true,因此此路由匹配

给定网址路径: / germany / aldi

  • 尝试匹配路线1
  • " isCategory"返回false,所以我们跳过这条路线
  • 尝试匹配路线2
  • " isMerchant"返回true,因此该路由匹配并执行MerchantController

给定网址路径: / germany / this-does-not-match-anything

  • 尝试匹配路线1
  • " isCategory"返回false,所以我们跳过这条路线
  • 尝试匹配路线2
  • " isMerchant"返回false,所以我们跳过这条路线
  • ...现在我们可以在没有路由匹配时执行默认行为

我想,条件会完全符合我的要求,但我只有表达式语言中的requestContext和请求,而不是服务容器。

有人知道,我如何将服务容器注入表达式语言以用于路由目的,或者可能有什么其他方法来帮助解决这个问题?

提前致谢: - )

1 个答案:

答案 0 :(得分:1)

有这样的两个变量很麻烦。根据经验,最佳做法是将这两者分开,如下所示:

route_category:
    pattern: /{location}/category/{category}

route_merchant:
    pattern: /{location}/merchant/{merchant}

否则正如David Kmenta所说,你将编写额外的代码,试图弄清楚是什么。

问问自己,这种类型的编码是否值得在网址中少加一个字?

要添加此功能,请考虑您的用户:如果您的商家听起来像一个类别,他们就会知道差异,或者只是混淆了他们之后的计划。