EventDispatcher   A
last analyzed

Complexity

Total Complexity 18

Size/Duplication

Total Lines 170
Duplicated Lines 0 %

Test Coverage

Coverage 98.75%

Importance

Changes 4
Bugs 1 Features 0
Metric Value
eloc 53
c 4
b 1
f 0
dl 0
loc 170
ccs 79
cts 80
cp 0.9875
rs 10
wmc 18

15 Methods

Rating   Name   Duplication   Size   Complexity  
A dispatchObjectsLifecycleCallbacks() 0 4 2
A dispatchPreRemove() 0 7 1
A dispatchOnClearEvent() 0 5 1
A dispatchLifecycleEvent() 0 7 1
A dispatchPrePersist() 0 7 1
A dispatchPreFlush() 0 5 1
A dispatchPreFlushLifecycleCallbacks() 0 3 1
A dispatchEvent() 0 7 2
A dispatchPostLoad() 0 3 1
A dispatchObjectLifecycleCallback() 0 12 2
A dispatchPostFlush() 0 5 1
A dispatchPreUpdate() 0 11 1
A __construct() 0 6 1
A dispatchPreLoad() 0 8 1
A dispatchOnFlush() 0 5 1
1
<?php
2
3
declare(strict_types=1);
4
5
namespace Doctrine\SkeletonMapper\UnitOfWork;
6
7
use Doctrine\Common\EventArgs;
8
use Doctrine\Common\EventManager;
9
use Doctrine\SkeletonMapper\Event;
10
use Doctrine\SkeletonMapper\Event\LifecycleEventArgs;
11
use Doctrine\SkeletonMapper\Event\PreLoadEventArgs;
12
use Doctrine\SkeletonMapper\Event\PreUpdateEventArgs;
13
use Doctrine\SkeletonMapper\Events;
14
use Doctrine\SkeletonMapper\Mapping\ClassMetadataInterface;
15
use Doctrine\SkeletonMapper\ObjectManagerInterface;
16
use function get_class;
17
18
class EventDispatcher
19
{
20
    /** @var ObjectManagerInterface */
21
    private $objectManager;
22
23
    /** @var EventManager */
24
    private $eventManager;
25
26 22
    public function __construct(
27
        ObjectManagerInterface $objectManager,
28
        EventManager $eventManager
29
    ) {
30 22
        $this->objectManager = $objectManager;
31 22
        $this->eventManager  = $eventManager;
32 22
    }
33
34 20
    public function dispatchEvent(string $eventName, EventArgs $event) : void
35
    {
36 20
        if (! $this->eventManager->hasListeners($eventName)) {
37
            return;
38
        }
39
40 20
        $this->eventManager->dispatchEvent($eventName, $event);
41 20
    }
42
43
    /**
44
     * @param object  $object
45
     * @param mixed[] $args
46
     */
47 20
    public function dispatchObjectLifecycleCallback(string $eventName, $object, array &$args = []) : void
48
    {
49 20
        $className = get_class($object);
50
51
        /** @var ClassMetadataInterface $class */
52 20
        $class = $this->objectManager->getClassMetadata($className);
53
54 20
        if (! $class->hasLifecycleCallbacks($eventName)) {
55 3
            return;
56
        }
57
58 20
        $class->invokeLifecycleCallbacks($eventName, $object, $args);
59 20
    }
60
61
    /**
62
     * @param object[] $objects
63
     */
64 12
    public function dispatchObjectsLifecycleCallbacks(string $eventName, array $objects) : void
65
    {
66 12
        foreach ($objects as $object) {
67 12
            $this->dispatchObjectLifecycleCallback($eventName, $object);
68
        }
69 12
    }
70
71 13
    public function dispatchPreFlush() : void
72
    {
73 13
        $this->dispatchEvent(
74 13
            Events::preFlush,
75 13
            new Event\PreFlushEventArgs($this->objectManager)
76
        );
77 13
    }
78
79
    /**
80
     * @param object[] $objects
81
     */
82 12
    public function dispatchPreFlushLifecycleCallbacks(array $objects) : void
83
    {
84 12
        $this->dispatchObjectsLifecycleCallbacks(Events::preFlush, $objects);
85 12
    }
86
87 12
    public function dispatchOnFlush() : void
88
    {
89 12
        $this->dispatchEvent(
90 12
            Events::onFlush,
91 12
            new Event\OnFlushEventArgs($this->objectManager)
92
        );
93 12
    }
94
95 12
    public function dispatchPostFlush() : void
96
    {
97 12
        $this->dispatchEvent(
98 12
            Events::postFlush,
99 12
            new Event\PostFlushEventArgs($this->objectManager)
100
        );
101 12
    }
102
103 9
    public function dispatchOnClearEvent(?string $className) : void
104
    {
105 9
        $this->dispatchEvent(
106 9
            Events::onClear,
107 9
            new Event\OnClearEventArgs($this->objectManager, $className)
108
        );
109 9
    }
110
111
    /**
112
     * @param object $object
113
     */
114 3
    public function dispatchPreRemove($object) : void
115
    {
116 3
        $this->dispatchObjectLifecycleCallback(Events::preRemove, $object);
117
118 3
        $this->dispatchEvent(
119 3
            Events::preRemove,
120 3
            new LifecycleEventArgs($object, $this->objectManager)
121
        );
122 3
    }
123
124
    /**
125
     * @param object $object
126
     */
127 10
    public function dispatchPreUpdate($object, ChangeSet $changeSet) : void
128
    {
129 10
        $args = [$changeSet];
130 10
        $this->dispatchObjectLifecycleCallback(Events::preUpdate, $object, $args);
131
132 10
        $this->dispatchEvent(
133 10
            Events::preUpdate,
134 10
            new PreUpdateEventArgs(
135 10
                $object,
136 10
                $this->objectManager,
137 10
                $changeSet
138
            )
139
        );
140 10
    }
141
142
    /**
143
     * @param object $object
144
     */
145 10
    public function dispatchPrePersist($object) : void
146
    {
147 10
        $this->dispatchObjectLifecycleCallback(Events::prePersist, $object);
148
149 10
        $this->dispatchEvent(
150 10
            Events::prePersist,
151 10
            new LifecycleEventArgs($object, $this->objectManager)
152
        );
153 10
    }
154
155
    /**
156
     * @param object  $object
157
     * @param mixed[] $data
158
     */
159 17
    public function dispatchPreLoad($object, array &$data) : void
160
    {
161 17
        $args = [&$data];
162 17
        $this->dispatchObjectLifecycleCallback(Events::preLoad, $object, $args);
163
164 17
        $this->dispatchEvent(
165 17
            Events::preLoad,
166 17
            new PreLoadEventArgs($object, $this->objectManager, $data)
167
        );
168 17
    }
169
170
    /**
171
     * @param object $object
172
     */
173 17
    public function dispatchPostLoad($object) : void
174
    {
175 17
        $this->dispatchLifecycleEvent(Events::postLoad, $object);
176 17
    }
177
178
    /**
179
     * @param object $object
180
     */
181 20
    public function dispatchLifecycleEvent(string $eventName, $object) : void
182
    {
183 20
        $this->dispatchObjectLifecycleCallback($eventName, $object);
184
185 20
        $this->dispatchEvent(
186 20
            $eventName,
187 20
            new LifecycleEventArgs($object, $this->objectManager)
188
        );
189 20
    }
190
}
191