3

我创建了一个服务,但每次调用它时,它都会创建一个新实例,而不是使用同一个实例。这是我的 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');

每次我调用控制器时,视图都会显示 NULL'TEST'。

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

4

2 回答 2

14

在一个请求期间,每次您调用

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

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

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

于 2012-07-14T19:20:39.730 回答
0

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

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

services:
    my_service:
        class: YourClass
        scope: prototype

更多关于范围在这里

于 2014-08-22T22:23:53.043 回答