예제 #1
0
 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());
 }
예제 #2
0
 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();
 }
예제 #3
0
파일: example.php 프로젝트: potfur/journal
$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);