如何正确使用 Symfony DI Service Container?

How to use Symfony DI Service Container properly?

我正在重构一些 soap 服务,其中静态方法用于记录和调用数据库实例。这是一个定制的代码,而不是框架。 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')
    ]);

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

将它们注射到各处是按照规定进行的,但是,我理解必须到处注射的麻烦。您是否尝试过调查 Symfony service Autowiring? 在这种情况下 可以 派上用场。

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

希望对您有所帮助...