PageRenderTime 48ms CodeModel.GetById 20ms RepoModel.GetById 1ms app.codeStats 0ms

/library/Zend/Cache/Storage/Plugin/Serializer.php

https://github.com/udotelaar/zf2
PHP | 352 lines | 194 code | 37 blank | 121 comment | 9 complexity | cddc2ff246097f80d9b7d7dfcfdda0ad MD5 | raw file
  1. <?php
  2. /**
  3. * Zend Framework
  4. *
  5. * LICENSE
  6. *
  7. * This source file is subject to the new BSD license that is bundled
  8. * with this package in the file LICENSE.txt.
  9. * It is also available through the world-wide-web at this URL:
  10. * http://framework.zend.com/license/new-bsd
  11. * If you did not receive a copy of the license and are unable to
  12. * obtain it through the world-wide-web, please send an email
  13. * to license@zend.com so we can send you a copy immediately.
  14. *
  15. * @category Zend
  16. * @package Zend_Cache
  17. * @subpackage Storage
  18. * @copyright Copyright (c) 2005-2011 Zend Technologies USA Inc. (http://www.zend.com)
  19. * @license http://framework.zend.com/license/new-bsd New BSD License
  20. */
  21. namespace Zend\Cache\Storage\Plugin;
  22. use stdClass,
  23. Traversable,
  24. Zend\Cache\Exception,
  25. Zend\Cache\Storage\Capabilities,
  26. Zend\Cache\Storage\Event,
  27. Zend\Cache\Storage\PostEvent,
  28. Zend\EventManager\EventCollection;
  29. /**
  30. * @category Zend
  31. * @package Zend_Cache
  32. * @subpackage Storage
  33. * @copyright Copyright (c) 2005-2011 Zend Technologies USA Inc. (http://www.zend.com)
  34. * @license http://framework.zend.com/license/new-bsd New BSD License
  35. */
  36. class Serializer extends AbstractPlugin
  37. {
  38. /**
  39. * @var array
  40. */
  41. protected $capabilities = array();
  42. /**
  43. * Handles
  44. *
  45. * @var array
  46. */
  47. protected $handles = array();
  48. /**
  49. * Attach
  50. *
  51. * @param EventCollection $eventCollection
  52. * @return Serializer
  53. * @throws Exception\LogicException
  54. */
  55. public function attach(EventCollection $events)
  56. {
  57. $index = spl_object_hash($events);
  58. if (isset($this->handles[$index])) {
  59. throw new Exception\LogicException('Plugin already attached');
  60. }
  61. $handles = array();
  62. $this->handles[$index] = & $handles;
  63. // read
  64. $handles[] = $events->attach('getItem.post', array($this, 'onReadItemPost'));
  65. $handles[] = $events->attach('getItems.post', array($this, 'onReadItemsPost'));
  66. // fetch / fetchAll
  67. $handles[] = $events->attach('fetch.post', array($this, 'onFetchPost'));
  68. $handles[] = $events->attach('fetchAll.post', array($this, 'onFetchAllPost'));
  69. // write
  70. $handles[] = $events->attach('setItem.pre', array($this, 'onWriteItemPre'));
  71. $handles[] = $events->attach('setItems.pre', array($this, 'onWriteItemsPre'));
  72. $handles[] = $events->attach('addItem.pre', array($this, 'onWriteItemPre'));
  73. $handles[] = $events->attach('addItems.pre', array($this, 'onWriteItemsPre'));
  74. $handles[] = $events->attach('replaceItem.pre', array($this, 'onWriteItemPre'));
  75. $handles[] = $events->attach('replaceItems.pre', array($this, 'onWriteItemsPre'));
  76. $handles[] = $events->attach('checkAndSetItem.pre', array($this, 'onWriteItemPre'));
  77. // increment / decrement item(s)
  78. $handles[] = $events->attach('incrementItem.pre', array($this, 'onIncrementItemPre'));
  79. $handles[] = $events->attach('incrementItems.pre', array($this, 'onIncrementItemsPre'));
  80. $handles[] = $events->attach('decrementItem.pre', array($this, 'onDecrementItemPre'));
  81. $handles[] = $events->attach('decrementItems.pre', array($this, 'onDecrementItemsPre'));
  82. // overwrite capabilities
  83. $handles[] = $events->attach('getCapabilities.post', array($this, 'onGetCapabilitiesPost'));
  84. return $this;
  85. }
  86. /**
  87. * Detach
  88. *
  89. * @param EventCollection $events
  90. * @return Serializer
  91. * @throws Exception\LogicException
  92. */
  93. public function detach(EventCollection $events)
  94. {
  95. $index = spl_object_hash($events);
  96. if (!isset($this->handles[$index])) {
  97. throw new Exception\LogicException('Plugin not attached');
  98. }
  99. // detach all handles of this index
  100. foreach ($this->handles[$index] as $handle) {
  101. $events->detach($handle);
  102. }
  103. // remove all detached handles
  104. unset($this->handles[$index]);
  105. return $this;
  106. }
  107. /**
  108. * On read item post
  109. *
  110. * @param PostEvent $event
  111. * @return void
  112. */
  113. public function onReadItemPost(PostEvent $event)
  114. {
  115. $options = $this->getOptions();
  116. $serializer = $options->getSerializer();
  117. $result = $event->getResult();
  118. $result = $serializer->unserialize($result);
  119. $event->setResult($result);
  120. }
  121. /**
  122. * On read items post
  123. *
  124. * @param PostEvent $event
  125. * @return void
  126. */
  127. public function onReadItemsPost(PostEvent $event)
  128. {
  129. $options = $this->getOptions();
  130. $serializer = $options->getSerializer();
  131. $result = $event->getResult();
  132. foreach ($result as &$value) {
  133. $value = $serializer->unserialize($value);
  134. }
  135. $event->setResult($result);
  136. }
  137. /**
  138. * On fetch post
  139. *
  140. * @param PostEvent $event
  141. * @return void
  142. */
  143. public function onFetchPost(PostEvent $event)
  144. {
  145. $options = $this->getOptions();
  146. $serializer = $options->getSerializer();
  147. $item = $event->getResult();
  148. if (isset($item['value'])) {
  149. $item['value'] = $serializer->unserialize($item['value']);
  150. }
  151. $event->setResult($item);
  152. }
  153. /**
  154. * On fetch all post
  155. *
  156. * @param PostEvent $event
  157. * @return void
  158. */
  159. public function onFetchAllPost(PostEvent $event)
  160. {
  161. $options = $this->getOptions();
  162. $serializer = $options->getSerializer();
  163. $result = $event->getResult();
  164. foreach ($result as &$item) {
  165. if (isset($item['value'])) {
  166. $item['value'] = $serializer->unserialize($item['value']);
  167. }
  168. }
  169. $event->setResult($result);
  170. }
  171. /**
  172. * On write item pre
  173. *
  174. * @param Event $event
  175. * @return void
  176. */
  177. public function onWriteItemPre(Event $event)
  178. {
  179. $options = $this->getOptions();
  180. $serializer = $options->getSerializer();
  181. $params = $event->getParams();
  182. $params['value'] = $serializer->serialize($params['value']);
  183. }
  184. /**
  185. * On write items pre
  186. *
  187. * @param Event $event
  188. * @return void
  189. */
  190. public function onWriteItemsPre(Event $event)
  191. {
  192. $options = $this->getOptions();
  193. $serializer = $options->getSerializer();
  194. $params = $event->getParams();
  195. foreach ($params['keyValuePairs'] as &$value) {
  196. $value = $serializer->serialize($value);
  197. }
  198. }
  199. /**
  200. * On increment item pre
  201. *
  202. * @param Event $event
  203. * @return mixed
  204. */
  205. public function onIncrementItemPre(Event $event)
  206. {
  207. $event->stopPropagation(true);
  208. $cache = $event->getTarget();
  209. $params = $event->getParams();
  210. $token = null;
  211. $oldValue = $cache->getItem(
  212. $params['key'],
  213. array('token' => &$token) + $params['options']
  214. );
  215. return $cache->checkAndSetItem(
  216. $token,
  217. $oldValue + $params['value'],
  218. $params['key'],
  219. $params['options']
  220. );
  221. }
  222. /**
  223. * On increment items pre
  224. *
  225. * @param Event $event
  226. * @return mixed
  227. */
  228. public function onIncrementItemsPre(Event $event)
  229. {
  230. $event->stopPropagation(true);
  231. $cache = $event->getTarget();
  232. $params = $event->getParams();
  233. $keyValuePairs = $cache->getItems(array_keys($params['keyValuePairs']), $params['options']);
  234. foreach ($params['keyValuePairs'] as $key => &$value) {
  235. if (isset($keyValuePairs[$key])) {
  236. $keyValuePairs[$key]+= $value;
  237. } else {
  238. $keyValuePairs[$key] = $value;
  239. }
  240. }
  241. return $cache->setItems($keyValuePairs, $params['options']);
  242. }
  243. /**
  244. * On decrement item pre
  245. *
  246. * @param Event $event
  247. * @return mixed
  248. */
  249. public function onDecrementItemPre(Event $event)
  250. {
  251. $event->stopPropagation(true);
  252. $cache = $event->getTarget();
  253. $params = $event->getParams();
  254. $token = null;
  255. $oldValue = $cache->getItem(
  256. $params['key'],
  257. array('token' => &$token) + $params['options']
  258. );
  259. return $cache->checkAndSetItem(
  260. $token,
  261. $oldValue - $params['value'],
  262. $params['key'],
  263. $params['options']
  264. );
  265. }
  266. /**
  267. * On decrement items pre
  268. *
  269. * @param Event $event
  270. * @return mixed
  271. */
  272. public function onDecrementItemsPre(Event $event)
  273. {
  274. $event->stopPropagation(true);
  275. $cache = $event->getTarget();
  276. $params = $event->getParams();
  277. $keyValuePairs = $cache->getItems(array_keys($params['keyValuePairs']), $params['options']);
  278. foreach ($params['keyValuePairs'] as $key => &$value) {
  279. if (isset($keyValuePairs[$key])) {
  280. $keyValuePairs[$key]-= $value;
  281. } else {
  282. $keyValuePairs[$key] = -$value;
  283. }
  284. }
  285. return $cache->setItems($keyValuePairs, $params['options']);
  286. }
  287. /**
  288. * On get capabilities
  289. *
  290. * @param PostEvent $event
  291. * @return void
  292. */
  293. public function onGetCapabilitiesPost(PostEvent $event)
  294. {
  295. $baseCapabilities = $event->getResult();
  296. $index = spl_object_hash($baseCapabilities);
  297. if (!isset($this->capabilities[$index])) {
  298. $this->capabilities[$index] = new Capabilities(
  299. new stdClass(), // marker
  300. array('supportedDatatypes' => array(
  301. 'NULL' => true,
  302. 'boolean' => true,
  303. 'integer' => true,
  304. 'double' => true,
  305. 'string' => true,
  306. 'array' => true,
  307. 'object' => 'object',
  308. 'resource' => false,
  309. )),
  310. $baseCapabilities
  311. );
  312. }
  313. $event->setResult($this->capabilities[$index]);
  314. }
  315. }