使用Symfony 3 Dependency Injection组件,如何在一个服务上使用方法的返回值作为另一个服务上的构造函数的参数?
例如,我正在寻找模仿这个的配置语法:
<?php
class Foo {
public function getParam() {
// ...
return $param;
}
}
class Bar {
public function __construct ($param) {
// ...
}
}
$foo = new Foo();
$bar = new Bar($foo->getParam());
答案 0 :(得分:4)
您可以使用Use a Factory to Create Services或Inject Values Based on Complex Expressions(通过表达语言从sf 2.4开始)作为示例,采用yaml格式:
services.yml
services:
app.foo:
class: Foo
app.bar:
class: Bar
arguments: ["@=service('foo').getParam()"]
希望这个帮助
答案 1 :(得分:2)
你不应该这样做,因为你应该not construct components using runtime data。相反,您只需将Foo
注入Bar
即可。这样,Bar
可以在运行时调用getParam()
,即在构建对象图之后:
class Bar {
private $foo;
public function __constract ($foo) {
$this->foo = $foo;
}
public function handle() {
$this->foo.getParam();
}
}
// Composition Root
$bar = new Bar(new Foo());
答案 2 :(得分:0)
我发布此消息后不久发现的一个解决方案是将Foo :: getParam()的结果存储为另一个服务。
<container>
<services>
<service id="foo" class="Foo" />
<service id="foo.param" public="false">
<factory service="foo" method="getParam" />
</service>
<service id="bar" class="Bar">
<argument type="service" id="foo.param" />
</service>
</services>
</container>
我不相信这是公认的解决方案。