3 * Zend Framework (http://framework.zend.com/)
5 * @link http://github.com/zendframework/zf2 for the canonical source repository
6 * @copyright Copyright (c) 2005-2013 Zend Technologies USA Inc. (http://www.zend.com)
7 * @license http://framework.zend.com/license/new-bsd New BSD License
10 namespace Zend\Cache\Storage\Plugin
;
13 use Zend\Cache\Exception
;
14 use Zend\Cache\Storage\Capabilities
;
15 use Zend\Cache\Storage\Event
;
16 use Zend\Cache\Storage\PostEvent
;
17 use Zend\EventManager\EventManagerInterface
;
19 class Serializer
extends AbstractPlugin
24 protected $capabilities = array();
29 public function attach(EventManagerInterface
$events, $priority = 1)
31 // The higher the priority the sooner the plugin will be called on pre events
32 // but the later it will be called on post events.
33 $prePriority = $priority;
34 $postPriority = -$priority;
37 $this->listeners
[] = $events->attach('getItem.post', array($this, 'onReadItemPost'), $postPriority);
38 $this->listeners
[] = $events->attach('getItems.post', array($this, 'onReadItemsPost'), $postPriority);
41 $this->listeners
[] = $events->attach('setItem.pre', array($this, 'onWriteItemPre'), $prePriority);
42 $this->listeners
[] = $events->attach('setItems.pre', array($this, 'onWriteItemsPre'), $prePriority);
44 $this->listeners
[] = $events->attach('addItem.pre', array($this, 'onWriteItemPre'), $prePriority);
45 $this->listeners
[] = $events->attach('addItems.pre', array($this, 'onWriteItemsPre'), $prePriority);
47 $this->listeners
[] = $events->attach('replaceItem.pre', array($this, 'onWriteItemPre'), $prePriority);
48 $this->listeners
[] = $events->attach('replaceItems.pre', array($this, 'onWriteItemsPre'), $prePriority);
50 $this->listeners
[] = $events->attach('checkAndSetItem.pre', array($this, 'onWriteItemPre'), $prePriority);
52 // increment / decrement item(s)
53 $this->listeners
[] = $events->attach('incrementItem.pre', array($this, 'onIncrementItemPre'), $prePriority);
54 $this->listeners
[] = $events->attach('incrementItems.pre', array($this, 'onIncrementItemsPre'), $prePriority);
56 $this->listeners
[] = $events->attach('decrementItem.pre', array($this, 'onDecrementItemPre'), $prePriority);
57 $this->listeners
[] = $events->attach('decrementItems.pre', array($this, 'onDecrementItemsPre'), $prePriority);
59 // overwrite capabilities
60 $this->listeners
[] = $events->attach('getCapabilities.post', array($this, 'onGetCapabilitiesPost'), $postPriority);
66 * @param PostEvent $event
69 public function onReadItemPost(PostEvent
$event)
71 $serializer = $this->getOptions()->getSerializer();
72 $result = $event->getResult();
73 $result = $serializer->unserialize($result);
74 $event->setResult($result);
80 * @param PostEvent $event
83 public function onReadItemsPost(PostEvent
$event)
85 $serializer = $this->getOptions()->getSerializer();
86 $result = $event->getResult();
87 foreach ($result as &$value) {
88 $value = $serializer->unserialize($value);
90 $event->setResult($result);
99 public function onWriteItemPre(Event
$event)
101 $serializer = $this->getOptions()->getSerializer();
102 $params = $event->getParams();
103 $params['value'] = $serializer->serialize($params['value']);
109 * @param Event $event
112 public function onWriteItemsPre(Event
$event)
114 $serializer = $this->getOptions()->getSerializer();
115 $params = $event->getParams();
116 foreach ($params['keyValuePairs'] as &$value) {
117 $value = $serializer->serialize($value);
122 * On increment item pre
124 * @param Event $event
127 public function onIncrementItemPre(Event
$event)
129 $storage = $event->getTarget();
130 $params = $event->getParams();
133 $oldValue = $storage->getItem($params['key'], $success, $casToken);
134 $newValue = $oldValue +
$params['value'];
137 $storage->checkAndSetItem($casToken, $params['key'], $oldValue +
$params['value']);
143 $event->stopPropagation(true);
148 * On increment items pre
150 * @param Event $event
153 public function onIncrementItemsPre(Event
$event)
155 $storage = $event->getTarget();
156 $params = $event->getParams();
157 $keyValuePairs = $storage->getItems(array_keys($params['keyValuePairs']));
158 foreach ($params['keyValuePairs'] as $key => & $value) {
159 if (isset($keyValuePairs[$key])) {
160 $keyValuePairs[$key]+
= $value;
162 $keyValuePairs[$key] = $value;
166 $failedKeys = $storage->setItems($keyValuePairs);
167 foreach ($failedKeys as $failedKey) {
168 unset($keyValuePairs[$failedKey]);
171 $event->stopPropagation(true);
172 return $keyValuePairs;
176 * On decrement item pre
178 * @param Event $event
181 public function onDecrementItemPre(Event
$event)
183 $storage = $event->getTarget();
184 $params = $event->getParams();
187 $oldValue = $storage->getItem($params['key'], $success, $casToken);
188 $newValue = $oldValue - $params['value'];
191 $storage->checkAndSetItem($casToken, $params['key'], $oldValue +
$params['value']);
197 $event->stopPropagation(true);
202 * On decrement items pre
204 * @param Event $event
207 public function onDecrementItemsPre(Event
$event)
209 $storage = $event->getTarget();
210 $params = $event->getParams();
211 $keyValuePairs = $storage->getItems(array_keys($params['keyValuePairs']));
212 foreach ($params['keyValuePairs'] as $key => &$value) {
213 if (isset($keyValuePairs[$key])) {
214 $keyValuePairs[$key]-= $value;
216 $keyValuePairs[$key] = -$value;
220 $failedKeys = $storage->setItems($keyValuePairs);
221 foreach ($failedKeys as $failedKey) {
222 unset($keyValuePairs[$failedKey]);
225 $event->stopPropagation(true);
226 return $keyValuePairs;
230 * On get capabilities
232 * @param PostEvent $event
235 public function onGetCapabilitiesPost(PostEvent
$event)
237 $baseCapabilities = $event->getResult();
238 $index = spl_object_hash($baseCapabilities);
240 if (!isset($this->capabilities
[$index])) {
241 $this->capabilities
[$index] = new Capabilities(
242 $baseCapabilities->getAdapter(),
243 new stdClass(), // marker
244 array('supportedDatatypes' => array(
251 'object' => 'object',
258 $event->setResult($this->capabilities
[$index]);