缓存在Phalcon中使用了Dependency Inject(DI)的对象

时间:2014-11-06 04:24:25

标签: php phalcon

Phalcon是一个解耦的PHP框架,允许通过DI容器注入服务。他们有几个默认服务,但也允许您定义自己的服务,如下所示:

$this->di->set('my_service',function(){
    return new myService();
});

然后,您可以通过几种不同的方式在应用程序中调用该服务:

$my_service = $this->di->get('my_service');

或者

$my_service = $this->di['my_service'];

我的应用程序利用依赖注入器以及Phalcon框架的另一个功能,一个数据缓存,这些功能不能很好地协同工作。

只要通过类中的DI调用服务,就会建立该类的DI参数。如果我尝试缓存该对象,则会收到错误Serialization of 'Phalcon\DI\FactoryDefault' is not allowed。我已经做了一些搜索,似乎无法找到一个解决方案,可以让我在同一个对象上使用依赖注入和缓存。

整个代码最终看起来像这样:

//In bootstrap file
$this->di->set('my_service',function(){
    return new myService();
});
//In another class
class myclass extends Phalcon\Mvc\User\Component
{
   $cache;
   public function construct(){
       $cache = new Phalcon\Cache\Frontend\Data(array('lifetime'=>24*3600*5));
       $this->cache = new Phalcon\Cache\Backend\File($cache, array('cacheDir' => '../app/cache/'));

       $this->di->get('my_service')->someAction();

       $this->cache->save('myKey',$this);
   }
}

有没有办法解决这个问题?

1 个答案:

答案 0 :(得分:0)

我认为问题是由使用匿名函数注册服务引起的。这是因为应用程序在实际运行之前不知道函数内部是什么,因此出厂默认DI无法序列化。

一个选项是不扩展Phalcon Component类,而是将所需的依赖项作为构造函数参数注入。这样,当您序列化对象时,您还没有序列化DI(当前通过Componant类继承)。

您可以让Phalcon通过在引导程序文件中将其设置为服务注册的一部分来自动注入所需的依赖项。

我能想到的另一个选择是使用不会对数据进行序列化的不同前端缓存适配器:

http://docs.phalconphp.com/en/latest/api/Phalcon_Cache_Frontend_None.html