В последнее время я занимался созданием службы, а затем настраивал ее как с подключением к базе данных, так и с объектом кеша. Для извлечения данных используется своего рода «каскад ленивой загрузки», который сначала просматривается в памяти, затем в кэше, а затем в БД.
Например, одно из моих приложений предназначено для агентства недвижимости, которое работает в нескольких, но не во всех провинциях нашей страны. У нас есть db-таблица провинций, некоторые из которых включены для внешнего интерфейса, и нам нужно визуализировать их в разных местах (скажем, как опции в элементе select). Мы делаем что-то вроде этого (устаревшая кодовая база, над которой я работаю, использует объекты DAO для доступа к базе данных и Cache_Lite PEAR для кэширования, поэтому пример не является строго Zend Framework, но принцип применяется в равной степени):
/**
* A service for fetching provinces
*/
class My_Service_Provinces
{
protected $_daoProvinces;
protected $_provinces = array();
protected $_cache;
public function __construct($daoProvinces)
{
$this->setDaoProvinces($daoProvinces);
}
public function setDaoProvinces($daoProvinces)
{
$this->_daoProvinces = $daoProvinces;
return $this;
}
public function getDaoProvinces()
{
return $this->_daoProvinces;
}
public function setCache($cache)
{
$this->_cache = $cache;
return $this;
}
public function getCache()
{
if (null == $this->_cache){
$this->_cache = new My_Cache_Provinces();
}
return $this->_cache;
}
public function getProvinces()
{
if (null == $this->_provinces){
$cache = $this->getCache();
$data = $cache->get();
if (!$data){
$dao = $this->getDaoProvinces();
$rows = $dao->frontend();
$data = array();
while ($row = $rows->get_row()){
$data[$row['provinceId']] = $row;
}
$cache->save(serialize($data));
} else {
$data = unserialize($data);
}
$this->_provinces = $data;
}
return $this->_provinces;
}
public function getProvince($provinceId)
{
$provinces = $this->getProvinces();
return isset($provinces[$provinceId]) ? $provinces[$provinceId] : null;
}
}
Объект кэша предварительно сконфигурирован с любым подходящим временем жизни. Я даю долгую жизнь редко меняющимся данным, более короткую жизнь часто меняющимся данным. Если мне действительно нужно, чтобы изменение данных было немедленно доступно приложению, скажем, администратор добавляет новую провинцию, - я создаю экземпляр объекта кеша и очищаю кеш при обновлении.
Я даже добавил фабрику, чтобы помочь создать экземпляр службы, чтобы вызывающему коду не приходилось избавляться от зависимостей. Код вызова - возможно, в контроллере или даже в представлении или помощнике представления - выглядит примерно так:
$service = My_Service_Factory::getService('provinces');
$provinces = $service->getProvinces();
Knowwhatimsayin?