Symfony如何将参数数组中的子值直接作为服务参数使用
Symfony 3.4 嵌套参数点式访问问题解答
结论
你所期望的%some_configuration.param2%写法在Symfony 3.4原生版本中无法实现。
Symfony 3.4的参数解析器不支持通过点语法直接访问数组类型参数的子键,使用上述写法时,系统会尝试查找名称为some_configuration.param2的顶层独立参数,找不到就会抛出参数不存在的错误。
可用替代方案
方案1:使用容器表达式直接取值(推荐)
Symfony 3.4已支持容器表达式语法,你可以直接在服务参数处调用表达式读取嵌套参数的子值,写法如下:
services: AppBundle\Service\MyService: arguments: $serviceparam: '@=parameter("some_configuration")["param2"]'
该方案无需额外配置、不需要重复定义参数,适合少量嵌套参数取值的场景。
方案2:拆分定义为独立顶层参数
如果你不想用表达式,可以直接在parameters.yml中将需要的子值拆分为独立参数:
parameters: some_configuration.param2: value2 # 保留原有数组参数也可以,不冲突 some_configuration: param1: value1 param2: '%some_configuration.param2%'
之后就可以用你原本预期的%some_configuration.param2%写法注入参数。
方案3:自定义编译器Pass批量展开参数
如果你有大量嵌套参数需要频繁取子值,可以自定义容器编译器Pass,自动把所有嵌套数组参数展开为带点的顶层参数,后续所有嵌套参数都可以直接用点语法访问。这个方案适合中大型项目统一规范参数写法,小项目没必要额外开发。
额外注意
你给出的示例parameters.yml里有拼写错误,顶层键是parameters不是paramters,拼写错误会导致参数无法正常加载,需要先修正。
内容的提问来源于stack exchange,提问作者amacrobert
相关产品推荐
相关产品推荐

