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()); |
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())); |
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 ($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
|
|
|
|
This check marks implicit conversions of arrays to boolean values in a comparison. While in PHP an empty array is considered to be equal (but not identical) to false, this is not always apparent.
Consider making the comparison explicit by using
empty(..)
or! empty(...)
instead.