Completed
Pull Request — master (#34)
by
unknown
13:06
created

DocumentEventResolver   A

Complexity

Total Complexity 21

Size/Duplication

Total Lines 165
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 5

Importance

Changes 0
Metric Value
wmc 21
lcom 1
cbo 5
dl 0
loc 165
rs 10
c 0
b 0
f 0

15 Methods

Rating   Name   Duplication   Size   Complexity  
A getEventLogInfo() 0 19 4
A getSingleIdentity() 0 8 2
A initialize() 0 8 1
A getIdField() 0 4 1
A getIdValue() 0 4 1
A getChangeSets() 0 4 2
A isUpdateEvent() 0 4 1
A getEventType() 0 4 1
A getDescription() 0 10 1
A getEventShortName() 0 8 2
A getName() 0 4 1
A getReflectionClassFromObject() 0 4 1
A getUnitOfWork() 0 4 1
A getDoctrine() 0 4 1
A setDoctrine() 0 4 1
1
<?php
2
3
/*
4
 * This file is part of the XiideaEasyAuditBundle package.
5
 *
6
 * (c) Xiidea <http://www.xiidea.net>
7
 *
8
 * This source file is subject to the MIT license that is bundled
9
 * with this source code in the file LICENSE.
10
 */
11
12
namespace Xiidea\EasyAuditBundle\Resolver;
13
14
use Doctrine\Bundle\MongoDBBundle\ManagerRegistry;
15
use Doctrine\Common\Util\ClassUtils;
16
use Symfony\Component\EventDispatcher\Event;
17
use Xiidea\EasyAuditBundle\Events\DoctrineDocumentEvent;
18
use Xiidea\EasyAuditBundle\Events\DoctrineEvents;
19
20
/** Custom Event Resolver Example Class */
21
class DocumentEventResolver implements EventResolverInterface
22
{
23
    protected $eventShortName;
24
25
    /**
26
     * @var  $event DoctrineDocumentEvent
27
     */
28
    protected $event;
29
30
    protected $document;
31
32
    protected $eventName;
33
34
    private $identity = ['', ''];
35
36
    /**
37
     * @var ManagerRegistry
38
     */
39
    protected $doctrine;
40
41
    /**
42
     * @param Event|DoctrineDocumentEvent $event
43
     * @param $eventName
44
     *
45
     * @return array
46
     * @throws \ReflectionException
47
     */
48
    public function getEventLogInfo(Event $event, $eventName)
49
    {
50
        if (!$event instanceof DoctrineDocumentEvent) {
51
            return null;
52
        }
53
54
        $this->initialize($event, $eventName);
55
56
        if ($this->isUpdateEvent() && null === $this->getChangeSets($this->document)) {
57
            return null;
58
        }
59
60
        $reflectionClass = $this->getReflectionClassFromObject($this->document);
61
62
        return [
63
            'description' => $this->getDescription($reflectionClass->getShortName()),
64
            'type'        => $this->getEventType($reflectionClass->getShortName())
65
        ];
66
    }
67
68
    protected function getSingleIdentity()
69
    {
70
        foreach ($this->event->getIdentity() as $field => $value) {
71
            return [$field, $value];
72
        }
73
74
        return ['', ''];
75
    }
76
77
    /**
78
     * @param DoctrineDocumentEvent $event
79
     * @param string $eventName
80
     */
81
    private function initialize(DoctrineDocumentEvent $event, $eventName)
82
    {
83
        $this->eventShortName = null;
84
        $this->eventName = $eventName;
85
        $this->event = $event;
86
        $this->document = $event->getLifecycleEventArgs()->getDocument();
87
        $this->identity = $this->getSingleIdentity();
88
    }
89
90
    private function getIdField()
91
    {
92
        return $this->identity[0];
93
    }
94
95
    private function getIdValue()
96
    {
97
        return $this->identity[1];
98
    }
99
100
    protected function getChangeSets($document)
101
    {
102
        return $this->isUpdateEvent() ? $this->getUnitOfWork()->getDocumentChangeSet($document) : null;
103
    }
104
105
    protected function isUpdateEvent()
106
    {
107
        return $this->getEventShortName() === 'updated';
108
    }
109
110
    /**
111
     * @param string $typeName
112
     * @return string
113
     */
114
    protected function getEventType($typeName)
115
    {
116
        return $typeName . ' ' . $this->getEventShortName();
117
    }
118
119
    /**
120
     * @param string $shortName
121
     * @return string
122
     */
123
    protected function getDescription($shortName)
124
    {
125
        return sprintf(
126
            '%s has been %s with %s = "%s"',
127
            $shortName,
128
            $this->getEventShortName(),
129
            $this->getIdField(),
130
            $this->getIdValue()
131
        );
132
    }
133
134
    /**
135
     * @return string
136
     */
137
    protected function getEventShortName()
138
    {
139
        if (null === $this->eventShortName) {
140
            $this->eventShortName = DoctrineEvents::getShortEventType($this->getName());
141
        }
142
143
        return $this->eventShortName;
144
    }
145
146
    /**
147
     * @return string
148
     */
149
    protected function getName()
150
    {
151
        return $this->eventName;
152
    }
153
154
    /**
155
     * @param $object
156
     * @return \ReflectionClass
157
     * @throws \ReflectionException
158
     */
159
    protected function getReflectionClassFromObject($object)
160
    {
161
        return new \ReflectionClass(ClassUtils::getClass($object));
162
    }
163
164
    protected function getUnitOfWork()
165
    {
166
        return $this->getDoctrine()->getManager()->getUnitOfWork();
167
    }
168
169
    /**
170
     * @return ManagerRegistry|object
171
     */
172
    protected function getDoctrine()
173
    {
174
        return $this->doctrine;
175
    }
176
177
    /**
178
     * @required
179
     * @param ManagerRegistry $doctrine
180
     */
181
    public function setDoctrine($doctrine)
182
    {
183
        $this->doctrine = $doctrine;
184
    }
185
}
186