composer require dmt-software/command-bus-validator
By default this middleware uses the StaticMethodLoader of the Symfony Validator component. If you have installed both doctrine/annotations
and doctrine/cache
, this default behaviour is extended with the AnnotationLoader.
Configure and adding this middleware to the commandBus:
<?php // src/CommandBus/builder.php use DMT\CommandBus\Validator\ValidationMiddleware; use League\Tactician\CommandBus; use League\Tactician\Handler\CommandHandlerMiddleware; /** @var CommandHandlerMiddleware $commandHandlerMiddleware */ $commandBus = new CommandBus( [ new ValidationMiddleware(), $commandHandlerMiddleware ] );
After the CommandBus is added, the commands it receives will be validated when the handle
method is called:
<?php use DMT\CommandBus\Validator\ValidationException; use League\Tactician\CommandBus; try { /** @var object $command */ /** @var CommandBus $commandBus */ $result = $commandBus->handle($command); } catch (ValidationException $exception) { $violations = $exception->getViolations(); foreach ($violations as $violation) { echo $violation->getMessage(); // outputs: the violation message(s) } }
The validator can also be plugged unto the middleware by providing it to the middleware constructor.
This example uses a FileLoader to determine the constraints for a command.
<?php // src/CommandBus/builder.php use DMT\CommandBus\Validator\ValidationMiddleware; use League\Tactician\CommandBus; use League\Tactician\Handler\CommandHandlerMiddleware; use Symfony\Component\Validator\ValidatorBuilder; $validator = (new ValidatorBuilder()) ->addYamlMapping('config/validation.yaml') ->getValidator(); /** @var CommandHandlerMiddleware $commandHandlerMiddleware */ $commandBus = new CommandBus( [ new ValidationMiddleware($validator), $commandHandlerMiddleware ] );