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

Мітки: веб-розробка, zend framework, patterns, 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


Повідомлення