如何将服务的方法结果作为另一个服务的参数注入?

时间:2015-12-10 16:14:28

标签: php symfony dependency-injection

我有一个FooService从另一个配置服务中获取一些数据。

我有配置服务,因为配置因请求数据而异。配置服务注入RequestStack并构建相关的配置数组。

我的FooService如下所示:

class Foo
{
    private $config;

    /**
     * @param Config $config
     */
    public function __construct(Config $config) {
        $this->config = $config->getData();
    }
}

然而,我不是注入服务,而是只注入getData的方法调用结果,因为它更容易进行单元测试。我不需要模拟配置,我只能传递一个数组。

我当前的service.yml的定义如下:

config:
    ...

foo:
    class: Kopernikus\LeBundle\Service\Foo
    arguments:
        - @config

我尝试通过以下方式更改我的foo定义,例如工厂方法:

foo:
    class: Kopernikus\LeBundle\Service\Foo
    arguments:
        - [@config, getData]

然而这也注入了整个服务。

如何将服务的方法结果作为另一个服务的参数注入?

2 个答案:

答案 0 :(得分:9)

您可以使用表达式语言(New in Symfony 2.4

来实现此目的

正如文档here中所述,您可以做一些例子:

config:
    ...

foo:
    class: Kopernikus\LeBundle\Service\Foo
        arguments:    ["@=service('config').getData()"]

希望这个帮助

答案 1 :(得分:0)

你基本上要求依赖注入容器。你可以创建一个具有简单函数的函数(例如)get(),它返回Foo的新实例?您可以定义它以在每次调用get()时创建新对象,或者更多的单个函数始终返回相同的对象(通过将其存储在私有静态变量中)。

例如,

<?php
class FooContainer implements YourContainerInterface {
    public static function get() {
        // Config logic here
        return new Foo($config);
    }
}