Symfony2 - 如何注入可选参数

时间:2015-05-20 08:01:27

标签: php symfony

我们说我有一个论坛服务。此服务需要一个论坛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:如果还有其他更好的做法"方法,我对投入持开放态度。

2 个答案:

答案 0 :(得分:3)

您可以通过多种方式完成此操作。

  1. 使%forum_url%不是可选但必须参数,但当您打算使用内部网址时,只需设置null值({y}中的~)到%forum_url%参数。然后,将%forum_url%@router注入您的服务并检查%forum_url%:如果它不为null,请使用它,如果为null则使用路由

  2. 更好的方法是创建另一个服务,让我们称之为url_resolver。您将此新服务注入ForumService。在url_resolver服务中,您执行第1点中描述的操作,因此您需要注入强制性%forum_url%@router。这比选项1

  3. 更简单
  4. 将整个容器注入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