在 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
由于 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