These results are based on our legacy PHP analysis, consider migrating to our new PHP analysis engine instead. Learn more
1 | <?php |
||
2 | namespace SmoothPhp\EventSourcing; |
||
3 | |||
4 | use SmoothPhp\Contracts\EventBus\EventBus; |
||
5 | use SmoothPhp\Contracts\EventSourcing\AggregateRoot as AggregateRootInterface; |
||
6 | use SmoothPhp\Contracts\EventStore\EventStore; |
||
7 | |||
8 | /** |
||
9 | * Class EventSourcedRepository |
||
10 | * @package SmoothPhp\EventSourcing |
||
11 | * @author Simon Bennett <[email protected]> |
||
12 | */ |
||
13 | abstract class EventSourcedRepository |
||
14 | { |
||
15 | /** @var EventStore */ |
||
16 | private $eventStore; |
||
17 | |||
18 | /** @var EventBus */ |
||
19 | private $eventBus; |
||
20 | |||
21 | |||
22 | /** |
||
23 | * EventSourcedRepository constructor. |
||
24 | * @param EventStore $eventStore |
||
25 | * @param EventBus $eventBus |
||
26 | */ |
||
27 | 6 | public function __construct(EventStore $eventStore, EventBus $eventBus) |
|
28 | { |
||
29 | 6 | $this->eventStore = $eventStore; |
|
30 | 6 | $this->eventBus = $eventBus; |
|
31 | 6 | } |
|
32 | |||
33 | |||
34 | /** |
||
35 | * @return string |
||
36 | */ |
||
37 | abstract protected function getPrefix(); |
||
38 | |||
39 | /** |
||
40 | * @return string |
||
41 | */ |
||
42 | abstract protected function getAggregateType(); |
||
43 | |||
44 | /** |
||
45 | * @param string $id |
||
46 | * @return AggregateRootInterface |
||
47 | * @throws \SmoothPhp\EventStore\EventStreamNotFound |
||
48 | */ |
||
49 | 3 | public function load($id) |
|
50 | { |
||
51 | 3 | $domainEvents = $this->eventStore->load($this->getPrefix() . $id); |
|
52 | 3 | $aggregateClassName = $this->getAggregateType(); |
|
53 | |||
54 | 3 | $aggregate = unserialize(sprintf( 'O:%d:"%s":0:{}',strlen($aggregateClassName), $aggregateClassName)); |
|
55 | 3 | $aggregate->initializeState($domainEvents); |
|
56 | |||
57 | 3 | return $aggregate; |
|
58 | } |
||
59 | |||
60 | /** |
||
61 | * @param AggregateRootInterface $aggregate |
||
62 | * @return void |
||
63 | */ |
||
64 | 3 | public function save(AggregateRootInterface $aggregate) |
|
65 | { |
||
66 | 3 | $this->saveAggregate($aggregate,false); |
|
67 | 3 | } |
|
68 | |||
69 | /** |
||
70 | * @param AggregateRootInterface $aggregate |
||
71 | * @return void |
||
72 | */ |
||
73 | public function saveWithoutPlayheadCheck(AggregateRootInterface $aggregate) |
||
74 | { |
||
75 | $this->saveAggregate($aggregate,true); |
||
76 | } |
||
77 | |||
78 | /** |
||
79 | * @param AggregateRootInterface $aggregate |
||
80 | * @param bool $ignorePlayhead |
||
81 | */ |
||
82 | 3 | private function saveAggregate(AggregateRootInterface $aggregate,bool $ignorePlayhead = false) |
|
83 | { |
||
84 | 3 | $events = $aggregate->getUncommittedEvents(); |
|
85 | |||
86 | 3 | $this->eventStore->append($aggregate->getAggregateRootId(), $events,$ignorePlayhead); |
|
0 ignored issues
–
show
|
|||
87 | |||
88 | 3 | $this->eventBus->publish($events); |
|
89 | } |
||
90 | } |
This check compares calls to functions or methods with their respective definitions. If the call has more arguments than are defined, it raises an issue.
If a function is defined several times with a different number of parameters, the check may pick up the wrong definition and report false positives. One codebase where this has been known to happen is Wordpress.
In this case you can add the
@ignore
PhpDoc annotation to the duplicate definition and it will be ignored.