Php Symfony2-如何插入可选参数

Php Symfony2-如何插入可选参数,php,symfony,Php,Symfony,假设我有一个论坛服务。此服务需要论坛API的URL。我想要的是这个URL要么是内部的,要么是外部的 如果内部,则它将是一条路由,在routing.yml中配置,并由路由器服务返回 如果外部,它将是一个参数,在parameters.yml中配置 我想到的方法是: 在parameters.yml中查找变量forum_url。如果它不存在,请尝试获取该路径。否则,抛出异常 此实现的问题是,如果未定义变量,它会引发异常,因此我需要将其定义为可选参数(就像您可以使用服务(“@?service”) 更酷的是

假设我有一个论坛服务。此服务需要论坛API的URL。我想要的是这个URL要么是内部的,要么是外部的

如果内部,则它将是一条路由,在routing.yml中配置,并由路由器服务返回

如果外部,它将是一个参数,在parameters.yml中配置

我想到的方法是:

在parameters.yml中查找变量forum_url。如果它不存在,请尝试获取该路径。否则,抛出异常

此实现的问题是,如果未定义变量,它会引发异常,因此我需要将其定义为可选参数(就像您可以使用服务(“@?service”

更酷的是能够定义如下内容:

"%forum_url% ? %forum_url% : @router"
有没有关于如何实现这些目标的想法


附言:如果还有其他“更好的实践”方法,我愿意听取意见。

你可以用几种方法来做

  • 使
    %forum\u url%
    不是一个可选但必须的参数,但当您想要内部url时,只需设置
    null
    值(
    ~
    在yml中)到
    %forum\u url%
    参数。然后,将
    %forum\u url%
    @router
    都注入到您的服务中,并检查
    %forum\u url%
    :如果它不是空的,则使用它,如果它是空的,则使用路由

  • 更好的方法是创建另一个服务,我们称之为
    url\u解析器
    。您将此新服务注入您的
    ForumService
    。在
    url\u解析器
    服务中,您执行第1点中所述的操作,因此您需要强制注入
    %forum\u url%
    @router
    。这是一种更为可靠的方法选择1

  • 将整个容器注入ForumService并检查是否设置了
    %forum\u url%
    。但是,请注意,将整个容器注入服务被认为是一种不好的做法


  • 你可以用几种方法来做

  • 使
    %forum\u url%
    不是一个可选但必须的参数,但当您想要内部url时,只需设置
    null
    值(
    ~
    在yml中)到
    %forum\u url%
    参数。然后,将
    %forum\u url%
    @router
    都注入到您的服务中,并检查
    %forum\u url%
    :如果它不是空的,则使用它,如果它是空的,则使用路由

  • 更好的方法是创建另一个服务,我们称之为
    url\u解析器
    。您将此新服务注入您的
    ForumService
    。在
    url\u解析器
    服务中,您执行第1点中所述的操作,因此您需要强制注入
    %forum\u url%
    @router
    。这是一种更为可靠的方法选择1

  • 将整个容器注入ForumService并检查是否设置了
    %forum\u url%
    。但是,请注意,将整个容器注入服务被认为是一种不好的做法


  • 如果您的symfony版本支持表达式语言,则可以通过以下方式执行: “@=container.hasParameter('forum_url')?parameter('forum_url'):服务('router')”

    如果您的symfony版本支持表达式语言,则可以通过以下方式执行: “@=container.hasParameter('forum_url')?parameter('forum_url'):服务('router')”

    (对解决方案1的回应)是的,这是mi当前的实现。我注入了两者,并检查forum_url==null。但我希望得到更好的东西?不过感谢您的输入。这意味着我当前的解决方案没有那么糟糕,是吗?检查我的编辑和第2点。这是解决方案的更干净的方式,我想它已经足够干净了(单一责任到位)(响应解决方案3)我知道3是一种糟糕的做法。如果我尝试注射整个容器,我的大脑会发痒,这似乎是件好事。xD(响应解决方案2)我喜欢这种方法。我真的很喜欢它。它更干净,尽管它不能解决在parameters.yml上强制设置参数的需要。但是我想它也没那么糟糕。这样,用户就知道如果他决定到外部去,应该把它放在哪里。非常感谢你的全面回答:)(回应解决方案1)是的,这是mi当前的实现。我将两者都注入,并检查forum_url==null。但我希望有更好的东西。不过,感谢您的输入。这意味着我当前的解决方案没有那么糟糕,是吗?检查我的编辑和第2点。这是解决方案的更干净的方式,我想它足够干净了(单一责任到位)(对解决方案3的反应)我知道3是一种糟糕的做法。如果我尝试注射整个容器,我的大脑会发痒,这似乎是件好事。xD(对解决方案2的反应)我喜欢这种方法。我真的很喜欢。它更干净,尽管它不能解决在parameters.yml上强制设置该参数的需要。不过,我想它也没那么糟糕。这样,如果用户决定到外部去,他就知道“放在哪里”。非常感谢你的全面回答:)
    "%forum_url% ? %forum_url% : @router"