我有一个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]
然而这也注入了整个服务。
如何将服务的方法结果作为另一个服务的参数注入?
答案 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);
}
}