waw*_*awa -1 php dependency-injection autowired symfony
由于 Symfony 5.1 通过自动装配注入容器已Psr\Container\ContainerInterface被弃用,请参阅https://symfony.com/doc/current/service_container.html#public-versus-private-services
如果服务仍然需要访问容器,将来是否需要手动注入,或者是否有其他更方便的注入方式?
一种选择是使用按名称自动装配并注入它,只要有一个名为 的变量$container,但这感觉像是一种黑客攻击。
问题:如果在 Symfony 5.1+ 中服务仍然依赖于容器,那么授予服务访问容器的最佳实践是什么?
长期以来,人们一直不鼓励让您的服务具有容器感知能力。作为一般规则,您应该避免使您的服务具有容器感知能力,而应直接在构造函数中或通过 setter 注入传入所需的服务。在某些情况下,使用容器作为服务定位器可能很有用。例如,当您使用AbstractController或当您有一个接受大量“注册”服务的服务时,例如消息总线中的处理程序/发送者。对于这些情况,Symfony 提供了服务定位器/订阅者:https://symfony.com/doc/current/service_container/service_subscribers_locators.html
主要区别在于,您必须为定位器/订阅者定义服务,而不是像 Symfony 的内部容器那样让所有服务可用。但是,您可以标记应进入服务定位器/订阅者的服务,然后收集这些标记的服务,以便它们自动传递。请参阅:https ://symfony.com/doc/current/service_container/tags.html#reference-tagged-services