我创建了一个服务,但每次调用它时,它都会创建一个新实例,而不是使用相同的实例。 这是我的services.yml:
my.sessiondata:
class: My\Bundle\Service\SessionData
calls:
- [ setServices, [@security.context, @service_container, @session, @doctrine.orm.entity_manager] ]
scope: container
我的服务:
namespace My\Bundle\Service;
class SessionData
{
protected $company;
public function setServices($securityContext, $serviceContainer, $session, $em)
{
var_export($this->company);
if (!$this->company)
{
$this->company = "TEST";
var_export($this->company);
}
}
}
我在这样的控制器中调用服务:
$sessionData = $this->container->get('my.sessiondata');
视图保持diplaying NULL' TEST'每次我给控制器打电话。
知道为什么实例丢失了吗?
答案 0 :(得分:13)
在一次请求期间,每次致电
$this->container->get('my.sessiondata')
只要将范围设置为容器(默认值),您就会获得相同的实例。
容器不会在请求之间共享实例。这就是PHP的工作原理。每个请求都是独立的。虽然您可以共享一些数据(例如在会话中),但在单个请求中创建的所有对象在完成后都会被销毁。下次你点击服务器时,一切都需要重新创建。
答案 1 :(得分:0)
您必须使用scope
。服务的scope
控制容器使用服务实例的时间。正如Symfony2文档所示:
container
(默认值):每次从此容器请求时都使用相同的实例。
prototype
:每次请求服务时都会创建一个新实例。
services:
my_service:
class: YourClass
scope: prototype
有关范围的更多信息here。