Example #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());
 }
Example #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();
 }
Example #3
0
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);