Паттерн кэширования для моделей

Метки: веб-разработка, zend framework, php, паттерны, кэширование

Паттерн кешування для моделей Паттерн кешування для моделей
A caching pattern for models A caching pattern for models

Это паттерн для моделей использующих Zend_Cache и магический метод __call.

Простая идея
Изначальный смысл в том, что модель должна иметь возможность возвращать не кэшированные или кэшированные вызовы, без постоянной инициализации определенного объекта. Должно происходить легкое переключение между двумя вызовами, и кэш должен приходить уже с моделью объекта.

Старый способ
Перед представлением паттерна кэширования, я создавал бы объект, который потом бы использовал Zend_Cache_Frontend_Class, потом инициализировал новую сущность моей модели и там переопределил метод, который действует как прокси, но использует кэш. И если этого не достаточно, я инициализирую их оба, как в этом примере:
Убрать подсветку кода
1
2
3
4
5
6
<?php
$model = MyModel();
$model_cached = MyModelCached();
 
$values_direct = $model->doStuff();
$values_cached = $model_cached->doStuff();

Новый способ
Итак, Матиас спросил меня: Будет ли это лучше, если бы кэш уже был доступен в модели, и вы могли бы делать так:
Убрать подсветку кода
1
2
3
4
<?php
$model = MyModel();
$values_direct = $model->doStuff();
$values_cached = $model->cache->doStuff();

Отличная идея. Как вы можете видеть, предложенный способ, содержит немного кода, он интуитивно понятен и легко меняется, если вы захотите переключаться между кэшируемыми и некэшируемыми вызовами.

Код
Первое что нужно сделать, это создать объект, инициализирующий кэш. Мы инициализируем кэш с помощью Zend_Cache и затем используем функцию __call для проверки или вызов существует в кэшируемом объекте. Это позволит нам делать только достоверные вызовы.
Убрать подсветку кода
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
<?php
class BaseModelCache {
  private $object;
  private $cache;
  
  public function __construct($object) {
    $backendName = 'File';
    $frontendName = 'Class';
 
    $frontendOptions = array(
      'lifetime' => 1800,
    );
 
    $backendOptions = array(
      'cache_dir' => '/my/cache/dir/',
    );
 
    $this->object = $object;
    $frontendOptions['cached_entity'] = $object;
 
    try {
      Zend_Loader::loadClass('Zend_Cache');
      $this->cache = Zend_Cache::factory($frontendName, $backendName, $frontendOptions, $backendOptions);     
    } catch(Exception $e) {
      throw($e);
    }
  }
  
  public function __call($method, $args) {
    $class = get_class($this->object);
    $class_methods = get_class_methods($class);
 
    if(in_array($method , $class_methods)) {
        $caller = Array($this->cache, $method);
        return call_user_func_array($caller, $args);
    }
 
    throw new Exception( " Метод " . $method . " не существует в классе " . get_class($class ) . "." );
  }
}

Вторым шагом будет создать базовый класс модели, который будет использоваться для всех остальных моделей. Он будет инициализировать объект кэша, используя BaseModelCache и делать его доступным как public-свойство:
Убрать подсветку кода
1
2
3
4
5
6
7
8
<?php
abstract class BaseModel {
  public $cache;
 
  public function __construct() {
    $this->cache = new BaseModelCache($this);
  }
}

Вуаля! Сейчас мы можем создавать модели, расширяя BaseModel. Кэш будет доступен как описано выше

Оригинал: A caching pattern for models

Рейтинг: 12345   << Вы можете поставить оценку этой статье


Подобные статьи:
   6 инструментов чтобы быть эффективным Web-разработчиком
   Понимание области видимости в объектно-ориентированном JavaScript
   Введение в искусство модульного тестирования в PHP
   Интеграция FCKeditor в Zend_Form
   Автоматизированное тестирование с использованием Zend Framework


 
 

Оставить комментарий:

Имя


E-mail


Сообщение