Passed
Push — v1.x ( 9eac6f...b30d34 )
by Saulius
07:54
created

DoctrineEventsSubscriber   A

Complexity

Total Complexity 9

Size/Duplication

Total Lines 73
Duplicated Lines 0 %

Importance

Changes 0
Metric Value
eloc 22
dl 0
loc 73
rs 10
c 0
b 0
f 0
wmc 9

9 Methods

Rating   Name   Duplication   Size   Complexity  
A process() 0 7 1
A onPreUpdate() 0 3 1
A getSubscribedEvents() 0 9 1
A onPrePersist() 0 3 1
A onPreRemove() 0 3 1
A onPostUpdate() 0 3 1
A __construct() 0 4 1
A onPostRemove() 0 3 1
A onPostPersist() 0 3 1
1
<?php
2
/**
3
 * This file is part of the sauls/object-registry-bundle package.
4
 *
5
 * @author    Saulius Vaičeliūnas <[email protected]>
6
 * @link      http://saulius.vaiceliunas.lt
7
 * @copyright 2018
8
 *
9
 * For the full copyright and license information, please view the LICENSE
10
 * file that was distributed with this source code.
11
 */
12
13
namespace Sauls\Bundle\ObjectRegistryBundle\EvenListener;
14
15
use Doctrine\ORM\Event\LifecycleEventArgs;
16
use Doctrine\ORM\Event\PreUpdateEventArgs;
17
use Doctrine\ORM\Events;
18
use Sauls\Bundle\ObjectRegistryBundle\Event\DoctrineObjectEvents;
19
use Sauls\Bundle\ObjectRegistryBundle\Event\GenericDoctrineObjectEvent;
20
use Sauls\Bundle\ObjectRegistryBundle\EventDispatcher\EventDispatcherInterface;
21
use Sauls\Bundle\ObjectRegistryBundle\Factory\EventNameFactoryInterface;
22
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
23
24
class DoctrineEventsSubscriber implements EventSubscriberInterface
25
{
26
    /**
27
     * @var EventDispatcherInterface
28
     */
29
    private $eventDispatcher;
30
    /**
31
     * @var EventNameFactoryInterface
32
     */
33
    private $eventNameFactory;
34
35
    public function __construct(EventDispatcherInterface $eventDispatcher, EventNameFactoryInterface $eventNameFactory)
36
    {
37
        $this->eventDispatcher = $eventDispatcher;
38
        $this->eventNameFactory = $eventNameFactory;
39
    }
40
41
    /**
42
     * {@inheritdoc}
43
     */
44
    public static function getSubscribedEvents(): array
45
    {
46
        return [
47
            Events::prePersist => ['onPrePersist'],
48
            Events::postPersist => ['onPostPersist'],
49
            Events::preUpdate => ['onPreUpdate'],
50
            Events::postUpdate => ['onPostUpdate'],
51
            Events::preRemove => ['onPreRemove'],
52
            Events::postRemove => ['onPostRemove'],
53
        ];
54
    }
55
56
    public function onPrePersist(LifecycleEventArgs $event): void
57
    {
58
        $this->process(DoctrineObjectEvents::PRE_PERSIST, $event);
59
    }
60
61
    /**
62
     * @param string $eventName
63
     * @param LifecycleEventArgs|PreUpdateEventArgs $event
64
     */
65
    private function process(string $eventName, LifecycleEventArgs $event): void
66
    {
67
        $entity = $event->getEntity();
68
        $eventName = $this->eventNameFactory->create($eventName, $entity);
69
        $newEvent = new GenericDoctrineObjectEvent($entity, $event);
70
71
        $this->eventDispatcher->dispatch($eventName, $newEvent);
72
    }
73
74
    public function onPostPersist(LifecycleEventArgs $event): void
75
    {
76
        $this->process(DoctrineObjectEvents::POST_PERSIST, $event);
77
    }
78
79
    public function onPreUpdate(PreUpdateEventArgs $event): void
80
    {
81
        $this->process(DoctrineObjectEvents::PRE_UPDATE, $event);
82
    }
83
84
    public function onPostUpdate(LifecycleEventArgs $event): void
85
    {
86
        $this->process(DoctrineObjectEvents::POST_UPDATE, $event);
87
    }
88
89
    public function onPreRemove(LifecycleEventArgs $event): void
90
    {
91
        $this->process(DoctrineObjectEvents::PRE_REMOVE, $event);
92
    }
93
94
    public function onPostRemove(LifecycleEventArgs $event): void
95
    {
96
        $this->process(DoctrineObjectEvents::POST_REMOVE, $event);
97
    }
98
}
99