使用服务方法的返回值来构建另一个服务?

时间:2016-10-31 11:50:42

标签: symfony dependency-injection

使用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());

3 个答案:

答案 0 :(得分:4)

您可以使用Use a Factory to Create ServicesInject 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>

我不相信这是公认的解决方案。