function it_execute_extension_points(Extension $extension) { $command = new AddToCart("SKU", 1, (string) CartId::generate()); $extension->pre($command, Argument::type(ServiceLocator::class))->shouldBeCalled(); $extension->post($command, Argument::type(ServiceLocator::class))->shouldBeCalled(); $extension->expands($command)->willReturn(true); $this->registry->register($extension->getWrappedObject()); $this->execute($command, function () { }); }
/** * @param array $handlers * @param array $commandExtension * @return \Dumplie\SharedKernel\Application\CommandBus */ public function create(array $handlers = [], array $commandExtension = []) : \Dumplie\SharedKernel\Application\CommandBus { $commandHandlerMiddleware = new CommandHandlerMiddleware(new ClassNameExtractor(), new InMemoryLocator($handlers), new HandleInflector()); $serviceLocator = new InMemoryServiceLocator(); $extensionRegistry = new ExtensionRegistry($serviceLocator); foreach ($commandExtension as $extension) { $extensionRegistry->register($extension); } $extensionMiddleware = new ExtensionMiddleware($extensionRegistry); return new CommandBus(new Tactician([$extensionMiddleware, $commandHandlerMiddleware])); }
public function test_transaction_extension_rollback() { $transaction = $this->prophesize(Transaction::class); $transaction->commit()->shouldNotBeCalled(); $transaction->rollback()->shouldBeCalled(); $factory = new FactoryStub($transaction->reveal()); $transaction = new TransactionExtension($factory); $this->extensionRegistry->register($transaction); $this->expectException(ProductNotFoundException::class); $command = new AddToCart("SKU", 1, (string) CartId::generate()); $this->commandBus->handle($command); }
public function test_extensions_execution_order() { $command = new CreateCart((string) CartId::generate(), 'PLN'); $executionOrder = []; $prePromise = function () use(&$executionOrder) { $executionOrder[] = spl_object_hash($this); }; $extension1 = $this->createExtensionProphecy($command, $prePromise); $extension2 = $this->createExtensionProphecy($command, $prePromise); $this->extensionRegistry->register($extension1->reveal(), 0); $this->extensionRegistry->register($extension2->reveal(), 1); $this->extensionRegistry->pre($command); $this->assertEquals([spl_object_hash($extension2), spl_object_hash($extension1)], $executionOrder); }
/** * @param object $command * @param callable $next */ public function execute($command, callable $next) { if ($command instanceof Command) { $this->extensionRegistry->pre($command); } try { $next($command); } catch (\Exception $exception) { $this->extensionRegistry->passException($command, $exception); throw $exception; } if ($command instanceof Command) { $this->extensionRegistry->post($command); } }