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') 获取参数,它就可以工作。为什么?
为了使自动装配工作,类型提示需要匹配服务 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)
| 归档时间: |
|
| 查看次数: |
3347 次 |
| 最近记录: |