【问题标题】:Symfony 2 - Using custom service in routing expressionSymfony 2 - 在路由表达式中使用自定义服务
【发布时间】:2015-03-26 12:40:56
【问题描述】:

目前,我正在尝试实现一些通往 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”返回真,所以这条路线匹配

给定 URL 路径:/germany/aldi

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

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

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

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

有谁知道,我如何将服务容器注入到表达式语言中以用于路由目的或其他有助于解决此问题的方法?

提前致谢:-)

【问题讨论】:

  • 对 OT 感到抱歉,但您是如何让 service(...) 工作的?我正在尝试使用有条件的服务,但我得到的只是The function "service" does not exist around position 1

标签: php symfony routing


【解决方案1】:

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

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

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

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

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

除此之外,想想您的用户:如果您有一个听起来像一个类别的商家,他们会知道其中的区别吗?或者您所追求的方案会让他们感到困惑。

【讨论】:

  • 是的,你完全正确。这只会导致代码确定应该匹配哪个路由。我现在通过将 {category} 的要求定义为三个值之一解决了这个问题,因此 url 匹配器现在不需要动态数据库连接。谢谢你的帮助:-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-05-17
  • 2013-05-07
  • 1970-01-01
  • 1970-01-01
  • 2018-02-11
  • 1970-01-01
  • 2017-05-13
相关资源
最近更新 更多