Symfony2:每个服务调用的新实例,而不是使用相同的

时间:2012-07-14 19:08:07

标签: php symfony

我创建了一个服务,但每次调用它时,它都会创建一个新实例,而不是使用相同的实例。 这是我的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'每次我给控制器打电话。

知道为什么实例丢失了吗?

2 个答案:

答案 0 :(得分:13)

在一次请求期间,每次致电

$this->container->get('my.sessiondata')

只要将范围设置为容器(默认值),您就会获得相同的实例。

容器不会在请求之间共享实例。这就是PHP的工作原理。每个请求都是独立的。虽然您可以共享一些数据(例如在会话中),但在单个请求中创建的所有对象在完成后都会被销毁。下次你点击服务器时,一切都需要重新创建。

答案 1 :(得分:0)

您必须使用scope。服务的scope控制容器使用服务实例的时间。正如Symfony2文档所示:

container(默认值):每次从此容器请求时都使用相同的实例。 prototype:每次请求服务时都会创建一个新实例。

services:
    my_service:
        class: YourClass
        scope: prototype

有关范围的更多信息here