Паттерн кешування для моделей
Мітки: веб-розробка, zend framework, patterns, php, кешування
Паттерн кэширования для моделей
A caching pattern for models
| ← Автоматизоване тестування з використанням Zend Framework | Поглиблений дебаг в JavaScript → |
Це паттерн для моделей, які використовують Zend_Cache і магічний метод __call.
Проста ідея
Ідея в тому, що модель повинна мати можливість повертати не кешовані або кешовані виклики, без постійної ініціалізації певного об'єкту. Повинно відбуватися легке переключення між двома викликами, і кеш повинен приходити вже з моделлю об'єкта.
Старий спосіб
Перед представленням паттерну кешування, я створював би об'єкт, який би потім використовував Zend_Cache_Frontend_Class, потім ініціалізував нову сутність моєї моделі і там перевизначав метод, який діє як проксі, але використовує кеш. І якщо цього не досить, вони ініціалізуються обидва, як у цьому прикладі:
Прибрати підсвітку коду
Новий спосіб
Отже, Матіас запитав мене: Чи буде це краще, якщо б кеш вже був доступний в моделі, і ви могли б робити так:
Прибрати підсвітку коду
Відмінна ідея. Як ви можете бачити, запропонований спосіб, містить не багато коду, він інтуїтивно зрозумілий і легко змінюється, якщо ви захочете переключатися між кешованим і некешованим викликами.
Код
Перше, що потрібно зробити, це створити об'єкт, який ініціалізує кеш. Ми ініціалізіуємо кеш за допомогою Zend_Cache і потім використовуємо функцію __call для перевірки чи існує виклик в об'єкті, що кешується. Це дозволить нам робити тільки достовірні виклики.
Прибрати підсвітку коду
Другим кроком буде створити базовий клас моделі, який буде використовуватися для всіх інших моделей. Він буде ініціалізувати об'єкт кешу, використовуючи BaseModelCache і робити його доступним як public-властивість:
Прибрати підсвітку коду
Вуаля! Зараз ми можемо створювати моделі, розширюючи BaseModel. Кеш буде доступний як описано вище.
Оригінал: A caching pattern for models
Проста ідея
Ідея в тому, що модель повинна мати можливість повертати не кешовані або кешовані виклики, без постійної ініціалізації певного об'єкту. Повинно відбуватися легке переключення між двома викликами, і кеш повинен приходити вже з моделлю об'єкта.
Старий спосіб
Перед представленням паттерну кешування, я створював би об'єкт, який би потім використовував Zend_Cache_Frontend_Class, потім ініціалізував нову сутність моєї моделі і там перевизначав метод, який діє як проксі, але використовує кеш. І якщо цього не досить, вони ініціалізуються обидва, як у цьому прикладі:
Прибрати підсвітку коду
1 2 3 4 5 6 | $model = MyModel(); $model_cached = MyModelCached(); $values_direct = $model-> doStuff(); $values_cached = $model_cached-> doStuff(); |
Новий спосіб
Отже, Матіас запитав мене: Чи буде це краще, якщо б кеш вже був доступний в моделі, і ви могли б робити так:
Прибрати підсвітку коду
1 2 3 4 | $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 | 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 | abstract class BaseModel ( public $cache; public function __construct() ( $this-> cache = new BaseModelCache ($this); ) ) |
Вуаля! Зараз ми можемо створювати моделі, розширюючи BaseModel. Кеш буде доступний як описано вище.
Оригінал: A caching pattern for models
Рейтинг:




<< Ви можете поставити оцінку цій статтіПодібні статті:
6 інструментів для того щоб бути ефективним Web-розробником
Розуміння області видимості в об’єктно-орієнтованому JavaScript
Введення в мистецтво модульного тестування в PHP
Інтеграція FCKeditor в Zend_Form
Автоматизоване тестування з використанням Zend Framework