我找不到这个问题的答案...
如果我注入(inject)服务容器,例如:
// config.yml
my_listener:
class: MyListener
arguments: [@service_container]
my_service:
class: MyService
// MyListener.php
class MyListener
{
protected $container;
public function __construct(ContainerInterface $container)
{
$this->container = $container;
}
public function myFunction()
{
$my_service = $this->container->get('my_service');
$my_service->doSomething();
}
}
那么它就像我一样工作:
// config.yml
my_listener:
class: MyListener
arguments: [@my_service]
my_service:
class: MyService
// MyListener.php
class MyListener
{
protected $my_service;
public function __construct(MyService $my_service)
{
$this->my_service = $my_service;
}
public function myFunction()
{
$this->my_service->doSomething();
}
}
那么为什么我不应该只注入(inject)服务容器,并从我的类(class)中获取服务呢?
最佳答案
我为什么应该更喜欢注入(inject)服务的原因列表:
@mailer
,很容易从注入(inject)邮件程序的服务容器中计算出来。另一方面,如果您执行 $container->get('mailer')
,那么找出邮件程序在哪里使用的唯一方法就是执行 find
。 public function __construct(MyService $my_service)
{
$this->my_service = $my_service;
}
但是您已将监听器定义为:
my_listener:
class: Whatever
arguments: [@my_other_service]
当监听器接收到
MyOtherService
时,PHP 会抛出一个错误,告诉你它接收到了错误的类。如果您正在执行 $container->get('my_service')
,则您假设容器正在返回正确的类,并且可能需要很长时间才能确定它不是。 $service = $container->get('service');
,那么您的 IDE 不知道 $service
是什么。如果你注入(inject)public function __construct(MyService $my_service)
{
$this->my_service = $my_service;
}
那么你的 IDE 就知道
$this->my_service
是 MyService
的一个实例,并且可以提供方法名称、参数、文档等方面的帮助。$container->get('service')
分散在整个类(class)中,那么很难弄清楚。 lazy: true
。 就个人而言,唯一一次注入(inject)服务容器是最好的解决方案是当我试图将安全上下文注入(inject)到一个原则监听器中时。这引发了循环引用异常,因为用户存储在数据库中。结果是原则和安全上下文在编译时相互依赖。通过注入(inject)服务容器,我能够绕过循环依赖。但是,这可能是代码异味,并且有一些方法可以绕过它(例如,通过 using the event dispatcher ),但我承认增加的复杂性可能超过好处。
关于symfony - 在 Symfony2 中,为什么注入(inject)服务容器而不是单个服务是一个坏主意?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23931321/