diff --git a/src/Symfony/Component/Messenger/MessageBus.php b/src/Symfony/Component/Messenger/MessageBus.php index 0698f8e81a250..e9200c0c95090 100644 --- a/src/Symfony/Component/Messenger/MessageBus.php +++ b/src/Symfony/Component/Messenger/MessageBus.php @@ -12,7 +12,7 @@ namespace Symfony\Component\Messenger; use Symfony\Component\Messenger\Middleware\MiddlewareInterface; -use Symfony\Component\Messenger\Middleware\StackMiddleware; +use Symfony\Component\Messenger\Middleware\Pipeline; /** * @author Samuel Roze @@ -23,30 +23,14 @@ */ class MessageBus implements MessageBusInterface { - private $middlewareAggregate; + private $middlewares; /** * @param MiddlewareInterface[]|iterable $middlewareHandlers */ - public function __construct(iterable $middlewareHandlers = []) + public function __construct(array $middlewares = []) { - if ($middlewareHandlers instanceof \IteratorAggregate) { - $this->middlewareAggregate = $middlewareHandlers; - } elseif (\is_array($middlewareHandlers)) { - $this->middlewareAggregate = new \ArrayObject($middlewareHandlers); - } else { - $this->middlewareAggregate = new class() { - public $aggregate; - public $iterator; - - public function getIterator() - { - return $this->aggregate = new \ArrayObject(iterator_to_array($this->iterator, false)); - } - }; - $this->middlewareAggregate->aggregate = &$this->middlewareAggregate; - $this->middlewareAggregate->iterator = $middlewareHandlers; - } + $this->middlewares = $middlewares; } /** @@ -57,19 +41,10 @@ public function dispatch($message, array $stamps = []): Envelope if (!\is_object($message)) { throw new \TypeError(sprintf('Invalid argument provided to "%s()": expected object, but got %s.', __METHOD__, \gettype($message))); } - $envelope = Envelope::wrap($message, $stamps); - $middlewareIterator = $this->middlewareAggregate->getIterator(); - while ($middlewareIterator instanceof \IteratorAggregate) { - $middlewareIterator = $middlewareIterator->getIterator(); - } - $middlewareIterator->rewind(); - - if (!$middlewareIterator->valid()) { - return $envelope; - } - $stack = new StackMiddleware($middlewareIterator); + $envelope = Envelope::wrap($message, $stamps); + $pipeline = new Pipeline($this->middlewares); - return $middlewareIterator->current()->handle($envelope, $stack); + return $pipeline->handle($envelope); } } diff --git a/src/Symfony/Component/Messenger/Middleware/Carrier.php b/src/Symfony/Component/Messenger/Middleware/Carrier.php new file mode 100644 index 0000000000000..f724f94d540d2 --- /dev/null +++ b/src/Symfony/Component/Messenger/Middleware/Carrier.php @@ -0,0 +1,38 @@ +currentMiddleware = $currentMiddleware; + $this->nextHandler = $nextHandler; + } + + + public function handle(Envelope $envelope) : Envelope + { + return $this->currentMiddleware->handle($envelope, $this->nextHandler); + } +} diff --git a/src/Symfony/Component/Messenger/Middleware/MiddlewareInterface.php b/src/Symfony/Component/Messenger/Middleware/MiddlewareInterface.php index 674bca7e95651..d1ec363cfe13d 100644 --- a/src/Symfony/Component/Messenger/Middleware/MiddlewareInterface.php +++ b/src/Symfony/Component/Messenger/Middleware/MiddlewareInterface.php @@ -20,5 +20,5 @@ */ interface MiddlewareInterface { - public function handle(Envelope $envelope, StackInterface $stack): Envelope; + public function handle(Envelope $envelope, NextHandlerInterface $next): Envelope; } diff --git a/src/Symfony/Component/Messenger/Middleware/NextHandlerInterface.php b/src/Symfony/Component/Messenger/Middleware/NextHandlerInterface.php new file mode 100644 index 0000000000000..73a8bd507af0f --- /dev/null +++ b/src/Symfony/Component/Messenger/Middleware/NextHandlerInterface.php @@ -0,0 +1,13 @@ +handler = new Recipient(); + foreach (array_reverse($middlewares) as $middleware) { + $this->handler = new Carrier($middleware, $this->handler); + } + } + + public function handle(Envelope $envelope) : Envelope + { + return $this->handler->handle($envelope); + } +} diff --git a/src/Symfony/Component/Messenger/Middleware/Recipient.php b/src/Symfony/Component/Messenger/Middleware/Recipient.php new file mode 100644 index 0000000000000..33bb62b218818 --- /dev/null +++ b/src/Symfony/Component/Messenger/Middleware/Recipient.php @@ -0,0 +1,17 @@ + - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Messenger\Middleware; - -/** - * @author Nicolas Grekas - * - * @experimental in 4.2 - */ -interface StackInterface -{ - /** - * Returns the next middleware to process a message. - */ - public function next(): MiddlewareInterface; -} diff --git a/src/Symfony/Component/Messenger/Middleware/StackMiddleware.php b/src/Symfony/Component/Messenger/Middleware/StackMiddleware.php deleted file mode 100644 index 24516cd88111d..0000000000000 --- a/src/Symfony/Component/Messenger/Middleware/StackMiddleware.php +++ /dev/null @@ -1,50 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Messenger\Middleware; - -use Symfony\Component\Messenger\Envelope; - -/** - * @author Nicolas Grekas - * - * @experimental in 4.2 - */ -class StackMiddleware implements MiddlewareInterface, StackInterface -{ - private $middlewareIterator; - - public function __construct(\Iterator $middlewareIterator = null) - { - $this->middlewareIterator = $middlewareIterator; - } - - public function next(): MiddlewareInterface - { - if (null === $iterator = $this->middlewareIterator) { - return $this; - } - $iterator->next(); - - if (!$iterator->valid()) { - $this->middlewareIterator = null; - - return $this; - } - - return $iterator->current(); - } - - public function handle(Envelope $envelope, StackInterface $stack): Envelope - { - return $envelope; - } -}