【发布时间】: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