DomainEventPublisher   A
last analyzed

Complexity

Total Complexity 7

Size/Duplication

Total Lines 81
Duplicated Lines 0 %

Coupling/Cohesion

Components 2
Dependencies 5

Test Coverage

Coverage 100%

Importance

Changes 0
Metric Value
wmc 7
lcom 2
cbo 5
dl 0
loc 81
ccs 21
cts 21
cp 1
rs 10
c 0
b 0
f 0

4 Methods

Rating   Name   Duplication   Size   Complexity  
A __construct() 0 6 1
A getSubscribedEvents() 0 11 2
A onFlush() 0 5 1
A postFlush() 0 19 3
1
<?php
2
3
/**
4
 * GpsLab component.
5
 *
6
 * @author    Peter Gribanov <[email protected]>
7
 * @copyright Copyright (c) 2011, Peter Gribanov
8
 * @license   http://opensource.org/licenses/MIT
9
 */
10
11
namespace GpsLab\Bundle\DomainEvent\Event\Listener;
12
13
use Doctrine\Common\EventSubscriber;
14
use Doctrine\ORM\Event\OnFlushEventArgs;
15
use Doctrine\ORM\Event\PostFlushEventArgs;
16
use Doctrine\ORM\Events;
17
use GpsLab\Bundle\DomainEvent\Service\EventPuller;
18
use GpsLab\Domain\Event\Bus\EventBus;
19
use GpsLab\Domain\Event\Event;
20
21
class DomainEventPublisher implements EventSubscriber
22
{
23
    /**
24
     * @var EventPuller
25
     */
26
    private $puller;
27
28
    /**
29
     * @var EventBus
30
     */
31
    private $bus;
32
33
    /**
34
     * @var bool
35
     */
36
    private $enable;
37
38
    /**
39
     * @var Event[]
40
     */
41
    private $events = [];
42
43
    /**
44
     * @param EventPuller $puller
45
     * @param EventBus    $bus
46
     * @param bool        $enable
47
     */
48 8
    public function __construct(EventPuller $puller, EventBus $bus, $enable)
49
    {
50 8
        $this->bus = $bus;
51 8
        $this->puller = $puller;
52 8
        $this->enable = $enable;
53 8
    }
54
55
    /**
56
     * @return array
57
     */
58 2
    public function getSubscribedEvents()
59
    {
60 2
        if (!$this->enable) {
61 1
            return [];
62
        }
63
64
        return [
65 1
            Events::onFlush,
66 1
            Events::postFlush,
67
        ];
68
    }
69
70
    /**
71
     * @param OnFlushEventArgs $args
72
     */
73 6
    public function onFlush(OnFlushEventArgs $args)
74
    {
75
        // aggregate events from deleted entities
76 6
        $this->events = $this->puller->pull($args->getEntityManager()->getUnitOfWork());
77 6
    }
78
79
    /**
80
     * @param PostFlushEventArgs $args
81
     */
82 5
    public function postFlush(PostFlushEventArgs $args)
83
    {
84
        // aggregate PreRemove/PostRemove events
85 5
        $events = array_merge($this->events, $this->puller->pull($args->getEntityManager()->getUnitOfWork()));
86
87
        // clear aggregate events before publish it
88
        // it necessary for fix recursive publish of events
89 5
        $this->events = [];
90
91
        // flush only if has domain events
92
        // it necessary for fix recursive handle flush
93 5
        if (!empty($events)) {
94 4
            foreach ($events as $event) {
95 4
                $this->bus->publish($event);
96
            }
97
98 4
            $args->getEntityManager()->flush();
99
        }
100 5
    }
101
}
102