Для добавления недостающего функционала или изменения поведения адаптера хранилища используются плагины.
Плагины прослушивают события, вызываемые адаптерами и могут изменять аргументы вызываемых методов (*.post - events), пропускать непосредственно возвращать результат (используя stopPropagation), изменять результат (используя метод setResult класса Zend\Cache\Storage\PostEvent), а такк же ловить исключения (используя Zend\Cache\Storage\ExceptionEvent).
Плагины хранилищ могут быть легко созданы с помощью класса ZendCacheStorageFactory используя pluginFactory, или просто инициализированы одним из классов Zend\Cache\Storage\Plugin\*.
use Zend\Cache\StorageFactory; // Via factory: $cache = StorageFactory::factory(array( 'adapter' => 'filesystem', 'plugins' => array('serializer'), )); // Alternately: $cache = StorageFactory::adapterFactory('filesystem'); $plugin = StorageFactory::pluginFactory('serializer'); $cache->addPlugin($plugin); // Or manually: $cache = new ZendCacheStorageAdapterFilesystem(); $plugin = new ZendCacheStoragePluginSerializer(); $cache->addPlugin($plugin);
Zend\Cache\Storage\Adapter\ClearExpiredByFactorвызывает метод хранилища clearExpired() случайным образом (по фактору) после каждого вызова setItem(), setItems(), addItem() и addItems().
Опцииплагина:
clearing_factor integer 0 Фактор автоматической очистки
Важно:Требуется ClearExpiredInterface.
Хранилища должны реализовать Zend\Cache\Storage\ClearExpiredInterface для работы с этим плагином.
Плагин ExceptionHandler
Zend\Cache\Storage\Adapter\ExceptionHandler перехватывает все исключения, выбрасываемые при чтении или записи кэша и посылает их в calback функцию.
Можно настроить, должен ли планин повторно вызывать перехваченное исключение.
Опции плагина:
exception_callbackCallback/null null Callback функция будет вызвана, а перехвачное исключение юудет доступно как аргумент этой функции.
throw_exceptions boolean true Повторно вызвать перехваченное исключение
Zend\Cache\Storage\Adapter\IgnoreUserAbortигнорирует скрипты, вызванные пользователем, пока не закончится процесс записи кэша.
Опции плагина:
exit_on_abort boolean |true Прекратить выполнение скрипта, если пользователь отменил скрипт.
Zend\Cache\Storage\Adapter\OptimizeByFactorвыхывает метод хранилища optimize()случайным образом (по фактору) после удаления элементов из кэша.
Опции плагина:
optimizing_factor integer 0 Фактор автоматической оптимизации
Важно: Требуется OptimizableInterface
Хранилища должны реализовать Zend\Cache\Storage\OptimizableInterface для работы с этим плагином.
Zend\Cache\Storage\Adapter\Serializer серализует данные при записи в кэш, и десериализует при чтении. Таким образом можно хранить различные типы данных в хранилище, поддерживая только тип данных «строка»( string).
Опции плагина:
serializer null/string/ZendSerializerAdapterAdapterInterface null использоватьсериализацию.
- Если передан «null» используется сериализатор по-умолчанию.
- Если передано «string» , то нужно использовать еще и опцию «serializer_options»
serializer_options array [] Массив с опциями для сериализатора для создания эземпляра сериализатора.
Доступные методы
setOptions(ZendCacheStoragePluginPluginOptions $options)
Задать опции.
Типвозвращаемыхданных: Zend\Cache\Storage\Plugin\PluginInterface
getOptions()
Получить опции.
Типвозвращаемыхданных: Zend\Cache\Storage\Plugin\PluginOptions
attach(ZendEventManagerEventManagerInterface $events)
Определяется Zend\EventManager\ListenerAggregateInterface. Задаетслушателей.
Типвозвращаемыхданных:void
detach(ZendEventManagerEventManagerInterface $events)
Определяется Zend\EventManager\ListenerAggregateInterface. Отсоединяет все ранее присоединенные слушатели.
Тип возвращаемых данных:void
Основы написания своего плагина для хранилища.
use Zend\Cache\Storage\Event; use Zend\Cache\Storage\PluginAbstractPlugin; use Zend\EventManager\EventManagerInterface; class MyPlugin extends AbstractPlugin { protected $handles = array(); // This method have to attach all events required by this plugin public function attach(EventManagerInterface $events) { $this->handles[] = $events->attach('getItem.pre', array($this, 'onGetItemPre')); $this->handles[] = $events->attach('getItem.post', array($this, 'onGetItemPost')); return $this; } // This method have to attach all events required by this plugin public function detach(EventManagerInterface $events) { foreach ($this->handles as $handle) { $events->detach($handle); } $this->handles = array(); return $this; } public function onGetItemPre(Event $event) { $params = $event->getParams(); echo sprintf("Method 'getItem' with key '%s' startedn", params['key']); } public function onGetItemPost(Event $event) { $params = $event->getParams(); echo sprintf("Method 'getItem' with key '%s' finishedn", params['key']); } } // After defining this basic plugin we can instantiate and add it to an adapter instance $plugin = new MyPlugin(); $cache->addPlugin($plugin); // Now on calling getItem our basic plugin should print the expacted output $cache->getItem('cache-key'); // Method 'getItem' with key 'cache-key' started // Method 'getItem' with key 'cache-key' finished