Symfony 4 容器数组服务参数

0 php containers yaml dependency-injection symfony

在文件 service.yaml 我有:

parameters:
  security.allows.ip:
    - '127.0.0.1'
    - '127.0.0.2'
Run Code Online (Sandbox Code Playgroud)

或者:

parameters:
  security.allows.ip: ['127.0.0.1', '127.0.0.2']
Run Code Online (Sandbox Code Playgroud)

以及 DI 的配置:

services:
  _defaults:
    autowire: true
    autoconfigure: true
    public: false
Run Code Online (Sandbox Code Playgroud)

我想为班级配置服务:

security.class:
    class: App\Class
    arguments:
      - '%security.allows.ip%'
Run Code Online (Sandbox Code Playgroud)

最后我有消息:

无法自动装配服务“App\Class”:方法“__construct()”的参数“$securityConfiguration”必须具有类型提示或明确给出一个值。

构造函数定义是:

 public function __construct(array $securityConfiguration)
Run Code Online (Sandbox Code Playgroud)

你能帮我吗?在 symfony 2.8 中它可以工作,但是对于这个配置我有这个错误。类型提示字符串的其他服务是可以的,但不适用于此类。如果我添加容器接口来构造这个类并通过 ->getParameter('security.allows.ip') 获取参数,它就可以工作。为什么?

Cer*_*rad 6

为了使自动装配工作,类型提示需要匹配服务 ID。这里的问题是您有另一个类,您正试图将其名称相当糟糕的 App\Class 注入其中

class SomeOtherClass {
    public function __construct(App\Class $appClass)
Run Code Online (Sandbox Code Playgroud)

当您创建 AppClass 服务时,您为其指定了一个 id security.class。所以 autowire 寻找 App\Class 的服务 id,没有找到它,然后尝试创建一个。当然,它不能自动装配阵列。

解决此问题的一种方法是使用别名:

security.class:
    class: App\Class
    arguments:
        - '%security.allows.ip%'

App\Class: '@security.class'
Run Code Online (Sandbox Code Playgroud)

第二种(推荐)方法是完全取消 security.class id

App\Class:
    arguments:
        - '%security.allows.ip%'
Run Code Online (Sandbox Code Playgroud)

如果你真的想成为这个街区的酷孩子,你甚至可以去掉 arguments 关键字。

App\Class:
    $securityConfiguration: '%security.allows.ip%'
Run Code Online (Sandbox Code Playgroud)