在 Symfony 中注入 "Container"

Injecting the "Container" in Symfony

由于 Symfony 5.1 通过自动装配注入容器 Psr\Container\ContainerInterface 已弃用,请参阅 https://symfony.com/doc/current/service_container.html#public-versus-private-services

如果服务仍然需要访问容器,是否需要为将来手动注入,或者是否有其他更方便的注入方式?

一个选择是使用 Autowiring by Name 并注入它,只要有一个名为 $container 的变量,但感觉就像一个 hack。

问题:如果服务在 Symfony 5.1+ 中仍然依赖容器,那么授予服务访问容器的最佳实践是什么?

让您的服务容器感知已经有一段时间了。 作为一般规则,您应该避免让您的服务容器感知,而是直接在构造函数中或通过 setter-injection 传递所需的服务。在某些情况下,使用容器作为 服务定位器 可能很有用。例如,当您使用 AbstractController 或当您有一项服务接受大量“已注册”服务时,例如对于消息总线中的 handlers/senders。对于这些情况,Symfony 提供了服务 Locator/Subscriber: https://symfony.com/doc/current/service_container/service_subscribers_locators.html

主要区别在于,您必须为 locator/subscriber 定义服务,而不是让所有服务都可用,就像在 Symfony 的内部容器中一样。但是,您可以标记应该进入您的服务 locator/subscriber 的服务,然后收集这些标记的服务,这样它们就会自动通过。参见:https://symfony.com/doc/current/service_container/tags.html#reference-tagged-services