1 | <?php |
||
28 | class SensitiveDataMessageStream implements IteratorAggregate |
||
29 | { |
||
30 | /** |
||
31 | * @var array |
||
32 | */ |
||
33 | private $messages; |
||
34 | |||
35 | /** |
||
36 | * @param SensitiveDataMessage[] $messages |
||
37 | */ |
||
38 | public function __construct(array $messages) |
||
42 | |||
43 | public function applyToDomainEventStream(DomainEventStreamInterface $domainEventStream) |
||
44 | { |
||
45 | $sensitiveDataMap = $this->createSensitiveDataMap($this->messages); |
||
46 | |||
47 | /** @var DomainMessage $domainMessage */ |
||
48 | foreach ($domainEventStream as $domainMessage) { |
||
49 | $sensitiveDataMessage = isset($sensitiveDataMap[$domainMessage->getPlayhead()]) |
||
50 | ? $sensitiveDataMap[$domainMessage->getPlayhead()] |
||
51 | : null; |
||
52 | unset($sensitiveDataMap[$domainMessage->getPlayhead()]); |
||
53 | |||
54 | $this->setSensitiveData($domainMessage, $sensitiveDataMessage); |
||
55 | } |
||
56 | |||
57 | if (count($sensitiveDataMap) > 0) { |
||
58 | throw new SensitiveDataApplicationException(sprintf( |
||
59 | '%d sensitive data messages are still to be matched to events', |
||
60 | count($sensitiveDataMap) |
||
61 | )); |
||
62 | } |
||
63 | } |
||
64 | |||
65 | public function forget() |
||
66 | { |
||
67 | foreach ($this->messages as $message) { |
||
68 | $message->forget(); |
||
69 | } |
||
70 | } |
||
71 | |||
72 | public function getIterator() |
||
76 | |||
77 | /** |
||
78 | * @param DomainMessage $domainMessage |
||
79 | * @param SensitiveDataMessage|null $sensitiveDataMessage |
||
80 | */ |
||
81 | private function setSensitiveData(DomainMessage $domainMessage, SensitiveDataMessage $sensitiveDataMessage = null) |
||
116 | |||
117 | /** |
||
118 | * @param SensitiveDataMessage[] $messages |
||
119 | * @return SensitiveDataMessage[] The same messages, but indexed by their playheads. |
||
120 | */ |
||
121 | private function createSensitiveDataMap(array $messages) |
||
130 | } |
||
131 |
If a variable is not always an object, we recommend to add an additional type check to ensure your method call is safe: