1<?php
2/**
3 * Zend Framework (http://framework.zend.com/)
4 *
5 * @link      http://github.com/zendframework/zf2 for the canonical source repository
6 * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
7 * @license   http://framework.zend.com/license/new-bsd New BSD License
8 */
9
10namespace Zend\Cache\Storage\Plugin;
11
12use Zend\Cache\Storage\ExceptionEvent;
13use Zend\EventManager\EventManagerInterface;
14
15class ExceptionHandler extends AbstractPlugin
16{
17    /**
18     * {@inheritDoc}
19     */
20    public function attach(EventManagerInterface $events, $priority = 1)
21    {
22        $callback = array($this, 'onException');
23
24        // read
25        $this->listeners[] = $events->attach('getItem.exception', $callback, $priority);
26        $this->listeners[] = $events->attach('getItems.exception', $callback, $priority);
27
28        $this->listeners[] = $events->attach('hasItem.exception', $callback, $priority);
29        $this->listeners[] = $events->attach('hasItems.exception', $callback, $priority);
30
31        $this->listeners[] = $events->attach('getMetadata.exception', $callback, $priority);
32        $this->listeners[] = $events->attach('getMetadatas.exception', $callback, $priority);
33
34        // write
35        $this->listeners[] = $events->attach('setItem.exception', $callback, $priority);
36        $this->listeners[] = $events->attach('setItems.exception', $callback, $priority);
37
38        $this->listeners[] = $events->attach('addItem.exception', $callback, $priority);
39        $this->listeners[] = $events->attach('addItems.exception', $callback, $priority);
40
41        $this->listeners[] = $events->attach('replaceItem.exception', $callback, $priority);
42        $this->listeners[] = $events->attach('replaceItems.exception', $callback, $priority);
43
44        $this->listeners[] = $events->attach('touchItem.exception', $callback, $priority);
45        $this->listeners[] = $events->attach('touchItems.exception', $callback, $priority);
46
47        $this->listeners[] = $events->attach('removeItem.exception', $callback, $priority);
48        $this->listeners[] = $events->attach('removeItems.exception', $callback, $priority);
49
50        $this->listeners[] = $events->attach('checkAndSetItem.exception', $callback, $priority);
51
52        // increment / decrement item(s)
53        $this->listeners[] = $events->attach('incrementItem.exception', $callback, $priority);
54        $this->listeners[] = $events->attach('incrementItems.exception', $callback, $priority);
55
56        $this->listeners[] = $events->attach('decrementItem.exception', $callback, $priority);
57        $this->listeners[] = $events->attach('decrementItems.exception', $callback, $priority);
58
59        // utility
60        $this->listeners[] = $events->attach('clearExpired.exception', $callback, $priority);
61    }
62
63    /**
64     * On exception
65     *
66     * @param  ExceptionEvent $event
67     * @return void
68     */
69    public function onException(ExceptionEvent $event)
70    {
71        $options  = $this->getOptions();
72        $callback = $options->getExceptionCallback();
73        if ($callback) {
74            call_user_func($callback, $event->getException());
75        }
76
77        $event->setThrowException($options->getThrowExceptions());
78    }
79}
80