在Symfony2 / 3依赖注入容器中使用函数作为服务

时间:2017-11-03 12:05:43

标签: php symfony dependency-injection

我使用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建议你最终会有很多文件(有时)非常小的功能。

1 个答案:

答案 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