/** * @test * @expectedException \HelloFresh\Engine\CommandBus\Exception\CanNotInvokeHandlerException */ public function itFailsWhenHandlerHasAnInvalidHandleMethod() { $handler = new InvalidHandler(); $this->locator->addHandler($handler, TestCommand::class); $command = new TestCommand("hey"); $this->commandBus->execute($command); }
public function register(Application $app) { $app['event_store'] = $app->share(function ($app) { return new RedisEventStore($app['predis']); }); $app['user_repo'] = $app->share(function ($app) { return new UserReadRepo($app['user_repo.file']); }); $app['user_write_repo'] = $app->share(function ($app) { return new UserWriteRepo($app['event_store'], $app['event_bus']); }); $app['command_bus'] = $app->share(function ($app) { $locator = new InMemoryLocator(); $locator->addHandler(new RegisterHandler($app['user_repo'], $app['password_encoder']), RegisterCommand::class); $locator->addHandler(new LoginHandler(), LoginCommand::class); // Middleware is Tactician's plugin system. Even finding the handler and // executing it is a plugin that we're configuring here. $handlerMiddleware = new \League\Tactician\Handler\CommandHandlerMiddleware(new ClassNameExtractor(), $locator, new InvokeInflector()); return new \League\Tactician\CommandBus([$handlerMiddleware]); }); $app['event_bus'] = $app->share(function ($app) { }); $app['password_encoder'] = $app->share(function ($app) { return new UppercasePasswordEncoder(); }); $app['event_handler.user_login'] = $app->share(function ($app) { return new UserLogin($app['user_repo'], $app['password_encoder']); }); $app['event_handler.register_user'] = $app->share(function ($app) { return new RegisterUser($app['user_write_repo'], $app['password_encoder']); }); }
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); $dispatcher->addSubscriber($accountHistory); $dispatcher->addSubscriber($accountBalance); $dispatcher->addSubscriber($transferManager); /* * Normal event propagation
<?php require __DIR__ . '/../vendor/autoload.php'; // The basic code from example 1 that we reuse in future examples. use League\Tactician\Handler\Locator\InMemoryLocator; use League\Tactician\Handler\CommandNameExtractor\ClassNameExtractor; use League\Tactician\Handler\MethodNameInflector\HandleClassNameInflector; class RegisterUserCommand { public $emailAddress; public $password; } class RegisterUserHandler { public function handleRegisterUserCommand(RegisterUserCommand $command) { // Do your core application logic here. Don't actually echo things. :) echo "User {$command->emailAddress} was registered!\n"; } } $locator = new InMemoryLocator(); $locator->addHandler(new RegisterUserHandler(), RegisterUserCommand::class); $handlerMiddleware = new League\Tactician\Handler\CommandHandlerMiddleware(new ClassNameExtractor(), $locator, new HandleClassNameInflector()); $commandBus = new \League\Tactician\CommandBus([$handlerMiddleware]);
/** * @expectedException \League\Tactician\Exception\MissingHandlerException */ public function testHandlerMissing() { $this->inMemoryLocator->getHandlerForCommand('League\\Tactician\\Tests\\Fixtures\\Command\\CompleteTaskCommand'); }
/** * @expectedException \League\Tactician\Exception\MissingHandlerException */ public function testHandlerMissing() { $this->inMemoryLocator->getHandlerForCommand(CompleteTaskCommand::class); }
$app['debug'] = true; /* * Services */ $app[EntityManager::class] = $app->share(function () use($app) { $paths = ['./src/WebEngineers/Account']; $isDevMode = false; $dbParams = ['driver' => 'pdo_mysql', 'user' => 'root', 'password' => '', 'dbname' => 'finance']; $config = Setup::createAnnotationMetadataConfiguration($paths, $isDevMode); return EntityManager::create($dbParams, $config); }); $app[Emitter::class] = $app->share(function () use($app) { return new Emitter(); }); $app[CommandBus::class] = $app->share(function () use($app) { return new CommandBus([$app[CommandHandlerMiddleware::class]]); }); $app[CommandHandlerMiddleware::class] = $app->share(function () use($app) { $locator = new InMemoryLocator(); $locator->addHandler(new HandleRegisterAccount($app[EntityManager::class], $app[Emitter::class]), RegisterAccount::class); return new CommandHandlerMiddleware(new ClassNameExtractor(), $locator, new HandleClassNameInflector()); }); /* * Routes */ $app->get('/', function () use($app) { $command = new RegisterAccount('*****@*****.**', 'Zwaluw01'); $app[CommandBus::class]->handle($command); return new Response(); }); return $app;