symfony4访问嵌套参数

时间:2019-01-04 12:41:16

标签: symfony4

我几乎没有与AWS配置相关的参数,我需要从我的服务中进行访问。通常,如果我需要很少的参数并将其用于获取所需的参数,我会向服务中注入ParameterBagInterface,这样一来,我就无需检查参数是否确实存在并自行处理,例如如果参数不存在,则ParameterBag抛出ParameterNotFoundException

但是要使ParameterBag可以正常工作,应该在service.yml中添加参数,例如:

aws.default_one: '%env(AWS_DEFAULT_BUCKET)%' 
aws.default_two: '%env(AWS_DEFAULT_BUCKET)%'

现在我可以像这样$this->parameterBag->get('aws.default_one')

但是yml语法允许添加嵌套参数,因此我可以像这样向配置添加参数:

aws:
    default_one: '%env(AWS_DEFAULT_BUCKET)%' 
    default_two: '%env(AWS_DEFAULT_BUCKET)%'

它看起来更干净,更易读,尤其是当您有很多参数时,但是以这种方式我不能只写$this->parameterBag->get('aws.default_one')(它将抛出错误参数“ aws.default_one “必须定义),并且从我发现的参数包中获取它的唯一方法是$this->parameterBag->get('aws')['default_one'],但是根本就没有必要使用参数包,因为您仍然需要自己进行验证才能检查default_one键是否存在并进行处理。在这种情况下,除了传递整个参数包外,我还可以将%aws%传递给服务并像使用php数组一样使用它。

所以问题是:

  • 最佳做法是将参数列表注入到 服务,注入参数包或仅传递每个参数或数组 服务的嵌套参数?
  • 也许有某种方法可以使用点表示法而不是像$this->parameterBag->get('aws')['default_one']来获取嵌套参数,因为仅使用抛出异常的参数包可以使生活变得更轻松?

1 个答案:

答案 0 :(得分:1)

通常,在服务的参数部分中注入并定义参数:

    App\Service\MyService:
    arguments:
        $config:
            access_token: '%env(resolve:ACCESS_TOKEN)%'
            environment: '%env(resolve:SPEC_ENV)%'

在这里,我正在使用环境参数,但这并不重要,您可以使用纯值。 如果您需要注入多个参数:

    App\Service\MyService:
    arguments:
        $access_token: '%env(resolve:ACCESS_TOKEN)%'
        $environment: '%env(resolve:SPEC_ENV)%'

您的服务定义将如下所示:

public function __construct($access_token, $environment)
{
    //...
}

也来自文档:

  

已使用。符号是一种Symfony约定,使参数更易于阅读。参数是平面键值元素,无法将它们组织到嵌套数组中

您要尝试的是配置树,它更适合于公共捆绑包:https://symfony.com/doc/current/bundles/configuration.html