Symfony2中不同控制器操作之间的单例

时间:2014-07-08 08:48:56

标签: symfony design-patterns singleton

假设我们有单身类

class Registry {

    private static $_instance;

    private function __construct() {}
    private function __wakeup() {}
    private function __clone() {}

    private  $_map = array();

    public static function getInstance () {
        if (self::$_instance === null)
            self::$_instance = new self();
        return self::$_instance;
    }

    public function set ($key, $val) {
        self::getInstance()->_map[$key] = $val;
        return self::getInstance();
    }

    public function get($key)
    {
        if (array_key_exists($key, self::getInstance()->_map))
            return self::getInstance()->_map[$key];
        return null;
    }

}

我们有简单的Symfony2 Controller,有2个动作

class IndexController {
        public function indexAction () {
          Registry::getInstance()->set('key',true);
          return new Response(200);
        }
        public function secondAction () {
          $val = Registry::getInstance()->get('key');
          return new Response(200);
        }
}

我调用index action,然后调用第二个动作。但我无法找到关键,这是在第一个动作中设定的。我认为,新的单身实例在我的第二个动作中创造。为什么对象没有保存在内存中?我做错了什么?

1 个答案:

答案 0 :(得分:1)

如果您在不同的请求中调用indexActionsecondAction,它将无法按您希望的方式运行,因为请求之间不会共享Registry实例。

Singleton本身不存储任何“在内存中”(BTW Singleton现在被视为anti-pattern)。

我认为,您希望实现的目标可以通过使用会话存储来完成。请查看doc以获取有关如何实现此目标的更多信息。