【问题标题】:Symfony 4 container array service parameterSymfony 4 容器阵列服务参数
【发布时间】:2018-02-21 21:08:01
【问题描述】:

在文件 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') 获取参数,它就可以工作。为什么?

【问题讨论】:

  • 我建议编辑这篇文章的标题,使其更加关注问题细节。

标签: php symfony dependency-injection containers yaml


【解决方案1】:

为了让 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%'

【讨论】:

  • 这个名字只是一个例子,它并不是真正的类
  • 但是使用别名可以解决我的问题。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-24
相关资源
最近更新 更多