public function testOpenExistingStream() { $contract = Contract::fromClass(\stdClass::class); $identifier = EventStreamIdentifier::fromString('Foo'); $this->persistence->expects($this->once())->method('fetch')->with($contract, $identifier)->willReturn([]); $stream = $this->eventStore->openStream($contract, $identifier); $this->assertInstanceOf(EventStream::class, $stream); $this->assertEquals([], $stream->all()); }
private function persistAggregate(Aggregate $aggregate) { if (empty($aggregate->getChanges())) { return; } $events = new EventCollection($aggregate->getChanges()); $stream = $this->eventStore->openStream($aggregate->getContract(), EventStreamIdentifier::fromString($aggregate->getIdentifier())); foreach ($events as $event) { $stream->append($event); } $stream->commit(); $this->eventEmitter->emit($events); $aggregate->clearChanges(); }
$dispatcher->addSubscriber($accountHistory); $dispatcher->addSubscriber($accountBalance); $dispatcher->addSubscriber($transferManager); /* * Normal event propagation * * When commands trigger actions on Account, domain events will be emitted * As reaction to those events, projectors will create data for data models */ $bus->handle(new OpenAccountCommand('Foo', 'EUR')); $bus->handle(new DepositCommand('Foo', 20)); $bus->handle(new OpenAccountCommand('Bar', 'EUR')); $bus->handle(new TransferCommand('Foo', 'Bar', 10)); $bus->handle(new WithdrawCommand('Foo', 10)); $bus->handle(new WithdrawCommand('Bar', 10)); var_dump($accountBalance, $accountHistory, $transferManager, $persistence); /* * Introducing new projector * * New projector needs to catch up * Separate emitter is created - just for new projector - it will emit all historical events */ $dispatcher = new EventDispatcher(); $eventEmitter = new DispatcherEmitter($dispatcher); $export = new AccountExportProjector(); $dispatcher->addSubscriber($export); $stream = $eventStore->openStream(Contract::fromClass(Account::class), EventStreamIdentifier::fromString('Foo')); $eventEmitter->emit(new EventCollection($stream->all())); $stream = $eventStore->openStream(Contract::fromClass(Account::class), EventStreamIdentifier::fromString('Bar')); $eventEmitter->emit(new EventCollection($stream->all())); var_dump($export);