Я ищу для реализации кеша в пределах 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
@ Джон: удачи! Я не уверен, что соглашаюсь с вызовами моделей в представлениях, но пока вы чувствуете себя комфортно с ним. :) (Мое мнение о взглядах заключается в том, что они должны быть немыми и просто принимать любые данные, которые бросаются на тему, т.е. они не должны знать ни о чем, кроме простейших методов ваших моделей). – chelmertz