public function getAggregateRoot($aggregateId)
{
Assertion::string($aggregateId, 'AggregateId needs to be string');
if (isset($this->identityMap[$aggregateId])) {
return $this->identityMap[$aggregateId];
}
if ($this->snapshotStore) {
$eventSourcedAggregateRoot = $this->loadFromSnapshotStore($aggregateId);
if ($eventSourcedAggregateRoot) {
//Cache aggregate root in the identity map
$this->identityMap[$aggregateId] = $eventSourcedAggregateRoot;
return $eventSourcedAggregateRoot;
}
}
$streamName = $this->determineStreamName($aggregateId);
$streamEvents = null;
if ($this->oneStreamPerAggregate) {
$streamEvents = $this->eventStore->load($streamName)->streamEvents();
} else {
$streamEvents = $this->eventStore->loadEventsByMetadataFrom($streamName, ['aggregate_type' => $this->aggregateType->toString(), 'aggregate_id' => $aggregateId]);
}
if (!$streamEvents->valid()) {
return;
}
$eventSourcedAggregateRoot = $this->aggregateTranslator->reconstituteAggregateFromHistory($this->aggregateType, $streamEvents);
//Cache aggregate root in the identity map but without pending events
$this->identityMap[$aggregateId] = $eventSourcedAggregateRoot;
return $eventSourcedAggregateRoot;
}