我们说我有一个论坛服务。此服务需要一个论坛API的URL。我想要的是该URL是内部的还是外部的。
如果 内部 ,它将是路由,在routing.yml中配置并由路由器服务返回。
如果 外部 ,它将是参数,在parameters.yml中配置。
我想到的方法是:
在parameters.yml中查找变量forum_url。如果它不存在,请尝试获取该路线。否则,抛出异常。
services:
forums:
class: Acme\ForumsBundle\ForumService
arguments: ["@doctrine.orm.entity_manager","@router", "%forum_url%"]
这个实现的问题是,如果没有定义变量,它会引发异常,所以我需要将它定义为可选参数(就像你可以用服务做的那样) " @?service" )。
EVEN COOLER将能够定义如下内容:
"%forum_url% ? %forum_url% : @router"
关于如何实现这一目标的任何想法?
PS:如果还有其他更好的做法"方法,我对投入持开放态度。
答案 0 :(得分:3)
您可以通过多种方式完成此操作。
使%forum_url%
不是可选但必须参数,但当您打算使用内部网址时,只需设置null
值({y}中的~
)到%forum_url%
参数。然后,将%forum_url%
和@router
注入您的服务并检查%forum_url%
:如果它不为null,请使用它,如果为null则使用路由
更好的方法是创建另一个服务,让我们称之为url_resolver
。您将此新服务注入ForumService
。在url_resolver
服务中,您执行第1点中描述的操作,因此您需要注入强制性%forum_url%
和@router
。这比选项1
将整个容器注入ForumService并检查是否设置了%forum_url%
。但请注意,将整个容器注入服务被视为不良做法
答案 1 :(得分:0)
如果您的symfony版本支持表达式语言,则可以这样做: “@ = container.hasParameter('forum_url')?parameter('forum_url'):service('router')” http://symfony.com/doc/current/service_container/expression_language.html