vendor/league/tactician/src/Handler/CommandHandlerMiddleware.php line 56

Open in your IDE?
  1. <?php
  2. namespace League\Tactician\Handler;
  3. use League\Tactician\Middleware;
  4. use League\Tactician\Exception\CanNotInvokeHandlerException;
  5. use League\Tactician\Handler\CommandNameExtractor\CommandNameExtractor;
  6. use League\Tactician\Handler\Locator\HandlerLocator;
  7. use League\Tactician\Handler\MethodNameInflector\MethodNameInflector;
  8. /**
  9. * The "core" CommandBus. Locates the appropriate handler and executes command.
  10. */
  11. class CommandHandlerMiddleware implements Middleware
  12. {
  13. /**
  14. * @var CommandNameExtractor
  15. */
  16. private $commandNameExtractor;
  17. /**
  18. * @var HandlerLocator
  19. */
  20. private $handlerLocator;
  21. /**
  22. * @var MethodNameInflector
  23. */
  24. private $methodNameInflector;
  25. /**
  26. * @param CommandNameExtractor $commandNameExtractor
  27. * @param HandlerLocator $handlerLocator
  28. * @param MethodNameInflector $methodNameInflector
  29. */
  30. public function __construct(
  31. CommandNameExtractor $commandNameExtractor,
  32. HandlerLocator $handlerLocator,
  33. MethodNameInflector $methodNameInflector
  34. ) {
  35. $this->commandNameExtractor = $commandNameExtractor;
  36. $this->handlerLocator = $handlerLocator;
  37. $this->methodNameInflector = $methodNameInflector;
  38. }
  39. /**
  40. * Executes a command and optionally returns a value
  41. *
  42. * @param object $command
  43. * @param callable $next
  44. *
  45. * @return mixed
  46. *
  47. * @throws CanNotInvokeHandlerException
  48. */
  49. public function execute($command, callable $next)
  50. {
  51. $commandName = $this->commandNameExtractor->extract($command);
  52. $handler = $this->handlerLocator->getHandlerForCommand($commandName);
  53. $methodName = $this->methodNameInflector->inflect($command, $handler);
  54. // is_callable is used here instead of method_exists, as method_exists
  55. // will fail when given a handler that relies on __call.
  56. if (!is_callable([$handler, $methodName])) {
  57. throw CanNotInvokeHandlerException::forCommand(
  58. $command,
  59. "Method '{$methodName}' does not exist on handler"
  60. );
  61. }
  62. return $handler->{$methodName}($command);
  63. }
  64. }