我正在寻找实施缓存Zend_Db
,没有任何本地方法提供缓存到Zend_Db
,所以我想知道我应该在哪里做。我应该在Zend_Db中实现缓存?
我接过来一看至Zend_Db_Table_Abstract
(我扩展它在一个自定义App_Model_DbTable_Abstract
),我发现了一个受保护的方法_fetch()
直接采取Zend_Db_Table_Select
实例,貌似是适配器之前的最后一步。
我在考虑重写此方法,序列化$select
对象,对其进行散列并最终对其进行缓存,并检查提供的每个$ select对象以返回缓存还是最新的行集。
这是一个正确的方法吗?
这里是我只是做:
class App_Model_DbTable_Abstract extends Zend_Db_Table_Abstract
{
protected function _fetch(Zend_Db_Table_Select $select)
{
$hashedQuery = sha1(serialize($select->__toString()));
$cacheManager = Zend_Registry::get('Zend_Cache_Manager');
$cache = $cacheManager->getCache('database');
if (!($data = $cache->load($hashedQuery))) {
$data = parent::_fetch($select);
$cache->save($data, $hashedQuery);
}
return $data;
}
}
感谢您的回答,在阅读幻灯片后,我认为装饰师会做的伎俩,因为我有时只是在视图中访问模型时绕过控制器,我不想在那里实现我的缓存,而是一个装饰物体因为缓存不在视图和/或控制器中完成。 – John 2010-10-11 10:06:44
@John:祝你好运!我不确定我是否同意在视图中调用模型,但只要您对此感到满意即可。:)(我对视图的看法是,它们应该是愚蠢的,只是接受在主题上抛出的任何数据 - 即他们不应该知道任何东西,只是模型中最简单的方法)。 – chelmertz 2010-10-11 13:56:41