vendor/league/tactician/src/CommandBus.php line 35

Open in your IDE?
  1. <?php
  2. namespace League\Tactician;
  3. use League\Tactician\Exception\InvalidCommandException;
  4. use League\Tactician\Exception\InvalidMiddlewareException;
  5. /**
  6. * Receives a command and sends it through a chain of middleware for processing.
  7. *
  8. * @final
  9. */
  10. class CommandBus
  11. {
  12. /**
  13. * @var callable
  14. */
  15. private $middlewareChain;
  16. /**
  17. * @param Middleware[] $middleware
  18. */
  19. public function __construct(array $middleware)
  20. {
  21. $this->middlewareChain = $this->createExecutionChain($middleware);
  22. }
  23. /**
  24. * Executes the given command and optionally returns a value
  25. *
  26. * @param object $command
  27. *
  28. * @return mixed
  29. */
  30. public function handle($command)
  31. {
  32. if (!is_object($command)) {
  33. throw InvalidCommandException::forUnknownValue($command);
  34. }
  35. $middlewareChain = $this->middlewareChain;
  36. return $middlewareChain($command);
  37. }
  38. /**
  39. * @param Middleware[] $middlewareList
  40. *
  41. * @return callable
  42. */
  43. private function createExecutionChain($middlewareList)
  44. {
  45. $lastCallable = function () {
  46. // the final callable is a no-op
  47. };
  48. while ($middleware = array_pop($middlewareList)) {
  49. if (! $middleware instanceof Middleware) {
  50. throw InvalidMiddlewareException::forMiddleware($middleware);
  51. }
  52. $lastCallable = function ($command) use ($middleware, $lastCallable) {
  53. return $middleware->execute($command, $lastCallable);
  54. };
  55. }
  56. return $lastCallable;
  57. }
  58. }