只是一个简单的问题,想知道从Symfony2中的服务容器中检索的对象是通过引用还是作为副本返回的?
我问的原因是因为我想知道我是否做了类似的事情:
public function helloAction()
{
$mailer = $this->get('acme.mailer');
$mailer->shutdown();
}
在控制器中,shutdown()方法在对象内部执行某些操作,acme.mailer服务是否会在容器中“关闭”?
换句话说,我可以在从容器中取出服务后永久更改服务吗?这是好习惯吗?
由于
答案 0 :(得分:5)
服务通过引用返回,就像所有PHP对象一样(默认情况下)。
但这并不意味着您将始终获得给定服务的相同实例。
每个服务都在范围内定义。 DependencyInjection容器提供两个通用范围:
容器范围是默认值。
注意:Symfony引入了其他范围。
从官方文档中了解有关范围的详情:How to work with Scopes
回答问题的第二部分。如果在容器范围中定义了服务,我认为在控制器中销毁它不是一个好主意。您的应用程序的其他部分可能仍然需要它。我宁愿在析构函数中执行关闭。