首页 文章

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

提问于
浏览
1

我正在重构一些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

    将它们注入到处都是书本,然而,我理解必须到处去做的麻烦 . 你有没有尝试过调查Symfony service Autowiring?在这种情况下,一个人可以派上用场 .

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

    希望这个对你有帮助...

相关问题