/** * {@inheritDoc} */ public function save(AggregateRootInterface $aggregate, StreamName $streamName = null) { $streamName = $this->determineStreamName($streamName); $eventStream = new EventStream($streamName, $aggregate->getUncommittedEvents()); $this->eventStore->append($eventStream); $eventStream->each(function (DomainMessage $domainMessage) { $this->eventBus->publish($domainMessage->getPayload()); })->each(function (DomainMessage $domainMessage) use($streamName, $aggregate) { if ($this->snapshotter) { $this->snapshotter->take($streamName, $aggregate, $domainMessage); } }); }