我几乎没有与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']
来获取嵌套参数,因为仅使用抛出异常的参数包可以使生活变得更轻松?答案 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