如何正确使用Symfony DI服务容器?

时间:2017-07-17 09:11:33

标签: php symfony dependency-injection ioc-container

我正在重构一些soap服务,其中静态方法用于记录和调用db实例。它是一个定制的代码,而不是框架。 Db是单身,所以它有对象调用:

Db->getInstance()->prepare("some pepared statement");

和Logger是常规静态方法:

Logger::log("Some log massage!");

我想改变所有这些并且我实现了Symfony服务容器并注册了这两个服务:

    $container->register('Logger', 'Helpers\LogHelpers\LogManager');
    $container->register('Db', 'Helpers\ConfigHelpers\Db');

现在我应该将这些服务注入项目中的所有类,还是有办法从某些全局变量中使用这些服务?我可以静态地从容器中调用服务,但是制造容器的重点是什么呢?我问这个,因为到处注入它们似乎很复杂。另一种方法是将所有类注册为具有Logger和Db依赖关系的服务,如下所示:

        $container->register('SKSPartner', 'Partners\SKSPartner')->setArguments([
        new Reference('SKSSoapClient'),
        new Reference('Db'),
        new Reference('Logger'),
        new Reference('ServerManager')
    ]);
    $container->register('ThirdPartyIntegrationPartner', 'Partners\ThirdPartyIntegrationPartner')->setArguments([
        new Reference('ThirdPartyIntegrationSoapClient'),
        new Reference('Db'),
        new Reference('Logger'),
        new Reference('ServerManager')
    ]);

然后将这些大类用作服务。但随后项目的所有部分都将成为服务。据我所知,在服务容器中应该只注册将被一次又一次用作Logger和Db的类/服务?这里的一些帮助将不胜感激。

1 个答案:

答案 0 :(得分:0)

将它们注入到处都是书本,然而,我理解必须到处去的麻烦。您是否尝试过调查Symfony service Autowiring?在这种情况下,可以非常方便。

您提到的另一种方法是,有一些全局变量,您可以根据需要提取服务,这基本上是您的容器,但是全局。但事实是,在DI模式中,非常不鼓励注入(并且更少使用全局)容器。因为非常容易创建依赖引用循环而不鼓励注入容器,因为无法正确编写模拟测试而无法注入容器。

希望这有点帮助...