首页 文章

Symfony 4容器数组服务参数

提问于
浏览
0

在文件service.yaml我有:

parameters:
  security.allows.ip:
    - '127.0.0.1'
    - '127.0.0.2'

要么:

parameters:
  security.allows.ip: ['127.0.0.1', '127.0.0.2']

DI的配置:

services:
  _defaults:
    autowire: true
    autoconfigure: true
    public: false

我想为课程配置服务:

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

最后我有消息:

无法自动装配服务“App \ Class”:方法“__construct()”的参数“$ securityConfiguration”必须具有类型提示或显式赋予值 .

构造函数定义是:

public function __construct(array $securityConfiguration)

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

1 回答

  • 2

    为了使autowire工作,typehint需要匹配服务id . 这里的问题是你有另一个类,你试图注入你的名称相当差的App \ Class

    class SomeOtherClass {
        public function __construct(App\Class $appClass)
    

    当您创建AppClass服务时,您为其提供了security.class的id . 因此,autowire会查找App \ Class的服务ID,但找不到它,然后尝试创建一个 . 当然它不能自动装配阵列 .

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

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

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

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

    如果你真的想成为街区的酷孩子,你甚至可以删除arguments关键字 .

    App\Class:
        $securityConfiguration: '%security.allows.ip%'
    

相关问题