【问题标题】:Using functions as a service in Symfony2/3 dependency injection container在 Symfony2/3 依赖注入容器中使用函数作为服务
【发布时间】:2017-11-03 12:05:42
【问题描述】:

我正在使用 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 建议,您最终会为了 (有时)非常小的函数。

【问题讨论】:

    标签: php symfony dependency-injection


    【解决方案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

    【讨论】:

    • 很确定他们想完全避免使用类。
    • @Cerad 是的,如果可能的话
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-23
    • 1970-01-01
    相关资源
    最近更新 更多