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(); }
use Journal\DomainEvent\EventCollection; use Journal\EventStore\EventStore; use Journal\EventStore\EventStreamIdentifier; use Journal\Persistence\InMemory; use Journal\UnitOfWork\UnitOfWork; use League\Tactician\CommandBus; use League\Tactician\Handler\CommandHandlerMiddleware; use League\Tactician\Handler\CommandNameExtractor\ClassNameExtractor; use League\Tactician\Handler\Locator\InMemoryLocator; use League\Tactician\Handler\MethodNameInflector\HandleInflector; use League\Tactician\Plugins\LockingMiddleware; use Symfony\Component\EventDispatcher\EventDispatcher; error_reporting(E_ALL); require __DIR__ . '/../vendor/autoload.php'; $persistence = new InMemory(); $eventStore = new EventStore($persistence); $dispatcher = new EventDispatcher(); $eventEmitter = new DispatcherEmitter($dispatcher); $unitOfWork = new UnitOfWork($eventStore, $eventEmitter); $accounting = new Accounting($unitOfWork); $locator = new InMemoryLocator(); $bus = new CommandBus([new LockingMiddleware(), new CommandHandlerMiddleware(new ClassNameExtractor(), $locator, new HandleInflector())]); $locator->addHandler(new OpenAccountHandler($accounting), OpenAccountCommand::class); $locator->addHandler(new DepositHandler($accounting), DepositCommand::class); $locator->addHandler(new WithdrawHandler($accounting), WithdrawCommand::class); $locator->addHandler(new TransferHandler($accounting), TransferCommand::class); $locator->addHandler(new TransferDepositHandler($accounting), TransferDepositCommand::class); $locator->addHandler(new TransferWithdrawHandler($accounting), TransferWithdrawCommand::class); $accountHistory = new AccountHistoryProjector(); $accountBalance = new AccountBalanceProjector(); $transferManager = new TransferManager($bus);