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

时间:2012-01-24 20:00:10

标签: symfony

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

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

public function helloAction()
{
    $mailer = $this->get('acme.mailer');
    $mailer->shutdown();
}

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

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

由于

1 个答案:

答案 0 :(得分:5)

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

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

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

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

容器范围是默认值。

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

从官方文档中了解有关范围的详情:How to work with Scopes

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