【问题标题】:How to use Symfony DI Service Container properly?如何正确使用 Symfony DI 服务容器?
【发布时间】:2017-07-17 09:11:32
【问题描述】:

我正在重构一些使用静态方法记录和调用数据库实例的肥皂服务。这是一个定制的代码,而不是框架。 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 的类/服务?我们将不胜感激。

【问题讨论】:

  • 您认为只应定义可重用服务的理解是不正确的。理想情况下,服务的所有用户也是服务。正如公认的答案所暗示的那样,有一些替代方法,但请确保出于正确的原因使用它们。
  • @Cerad 我现在尝试了只使用可重用服务(Db 和 Logger)的方法,老实说,感觉有些不对劲。我不得不在太多地方注入服务。我现在将尝试使所有内容都成为服务,并且 Db 和 Logger 将成为将在容器本身中定义的依赖项(就像在上面的第二个示例中一样)。谢谢!

标签: php symfony dependency-injection ioc-container


【解决方案1】:

在任何地方都注射它们是按惯例进行的,但是,我理解必须去任何地方这样做的麻烦。您是否尝试过调查Symfony service Autowiring? 在这种情况下可能非常方便。

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

希望这会有所帮助...

【讨论】:

  • 所以基本上我应该尝试使用自动连接或将 Logger 和 Db 注入所有类。将所有类注册为具有 Db、Logger 和所有其他依赖项的服务的方法是错误的。此外,使容器全局化的唯一方法是使用一些静态方法,其中容器应该是,但它也是错误的,并且从使用静态方法获取 Logger 和 Db 没有任何变化,就像在项目的第一个版本中一样。我将尝试先实现自动布线,看看它是如何工作的。谢谢,我现在有一些工作要做!
猜你喜欢
  • 2017-08-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-03
  • 2011-07-14
  • 1970-01-01
相关资源
最近更新 更多