Symfony2服务容器 - get()通过引用还是复制返回对象?

Chr*_*ner 2 symfony

只是一个简单的问题,想知道从Symfony2中的服务容器中检索的对象是通过引用还是作为副本返回的?

我问的原因是因为我想知道我是否做了类似的事情:

public function helloAction()
{
    $mailer = $this->get('acme.mailer');
    $mailer->shutdown();
}
Run Code Online (Sandbox Code Playgroud)

在一个控制器中,shutdown()方法在对象内部执行某些操作,acme.mailer服务是否会在容器中"关闭"?

换句话说,我可以从容器中获取服务后永久更改服务吗?这是好习惯吗?

谢谢

Jak*_*las 5

像所有PHP对象一样,通过引用返回服务(默认情况下).

这并不意味着您将始终获得给定服务的相同实例.

每个服务都在范围内定义.DependencyInjection容器提供两个通用范围:

  • 容器 - 每次请求服务时,您都会获得相同的实例
  • 原型 - 每次您请求服务时,您都会获得一个新实例

容器范围是默认值.

注意:Symfony引入了其他范围.

从官方文档了解有关范围的更多信息:如何使用范围

回答问题的第二部分.如果在容器范围中定义了服务,我认为在控制器中销毁它不是一个好主意.您的应用程序的其他部分可能仍然需要它.我宁愿在析构函数中执行关闭.