我使用Symfony2并希望在Symfony2 / 3依赖注入容器中使用函数作为服务/工厂。这可能吗?如果默认情况下不支持,是否可以扩展DIC以允许此操作?
两种情况:
示例配置:
# example service definition
services:
service_a:
function: MyNamespace\createGrobulator
arguments:
- "@logger"
- "@doctrine.orm.entity_manager"
service_b:
function: MyNamespace\createTitulator
arguments:
- "@service_a"
和示例实现:
function createGrobulator(LoggerInterface $logger, $em)
{
// do something here
return function ($x) use ($logger, $em) {
return something;
};
}
function createTitulator($serviceA) {
return new ObjectOfSomeType($serviceA);
}
可以使用带有__invoke()
方法的类来模拟这个,但感觉非常冗长,好像不必遵守OOP,如果你使用PSR建议你最终会有很多文件(有时)非常小的功能。
答案 0 :(得分:1)
如果我理解正确,您可以使用calls
完成此操作,如下所示:
在您的services.yml
中services:
service_a:
function: MyNamespace\createGrobulator
arguments:
- "@logger"
- "@doctrine.orm.entity_manager"
calls:
- [setMyService, ['@my.service']]
并在您的服务中:
protected $myService;
public function setMyService(MyService $myService) {
$this->myService = $myService;
}
public function getMyService() {
return $this->myService;
}
function createTitulator() {
return new ObjectOfSomeType($this->getMyService());
}
我刚刚为您做了一个示例,有关详细信息,请查看Service Method Calls and Setter Injection