8000 [Messenger] make middlewares truly lazy on a bus · symfony/symfony@6a5d7a1 · GitHub
[go: up one dir, main page]

Skip to content

Commit 6a5d7a1

Browse files
[Messenger] make middlewares truly lazy on a bus
1 parent f24794d commit 6a5d7a1

File tree

3 files changed

+41
-28
lines changed

3 files changed

+41
-28
lines changed

src/Symfony/Component/Messenger/MessageBus.php

Lines changed: 33 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -11,28 +11,39 @@
1111

1212
namespace Symfony\Component\Messenger;
1313

14-
use Symfony\Component\Messenger\Exception\InvalidArgumentException;
1514
use Symfony\Component\Messenger\Middleware\MiddlewareInterface;
1615

1716
/**
1817
* @author Samuel Roze <samuel.roze@gmail.com>
1918
* @author Matthias Noback <matthiasnoback@gmail.com>
19+
* @author Nicolas Grekas <p@tchwork.com>
2020
*/
2121
class MessageBus implements MessageBusInterface
2222
{
23-
private $middlewareHandlers;
24-
25-
/**
26-
* @var MiddlewareInterface[]|null
27-
*/
28-
private $indexedMiddlewareHandlers;
23+
private $middlewareAggregate;
2924

3025
/**
3126
* @param MiddlewareInterface[]|iterable $middlewareHandlers
3227
*/
3328
public function __construct(iterable $middlewareHandlers = array())
3429
{
35-
$this->middlewareHandlers = $middlewareHandlers;
30+
if ($middlewareHandlers instanceof \IteratorAggregate) {
31+
$this->middlewareAggregate = $middlewareHandlers;
32+
} elseif (\is_array($middlewareHandlers)) {
33+
$this->middlewareAggregate = new \ArrayObject($middlewareHandlers);
34+
} else {
35+
$this->middlewareAggregate = new class() {
36+
public $aggregate;
37+
public $iterator;
38+
39+
public function getIterator()
40+
{
41+
return $this->aggregate = new \ArrayObject(iterator_to_array($this->iterator, false));
42+
}
43+
};
44+
$this->middlewareAggregate->aggregate = &$this->middlewareAggregate;
45+
$this->middlewareAggregate->iterator = $middlewareHandlers;
46+
}
3647
}
3748

3849
/**
@@ -41,24 +52,26 @@ public function __construct(iterable $middlewareHandlers = array())
4152
public function dispatch($message): void
4253
{
4354
if (!\is_object($message)) {
44-
throw new InvalidArgumentException(sprintf('Invalid type for message argument. Expected object, but got "%s".', \gettype($message)));
55+
throw new \TypeError(sprintf('Invalid argument provided to "%s()": expected object, but got %s.', __METHOD__, \gettype($message)));
4556
}
57+
$middlewareIterator = $this->middlewareAggregate->getIterator();
4658

47-
$this->callableForNextMiddleware(0)($message instanceof Envelope ? $message : new Envelope($message));
48-
}
49-
50-
private function callableForNextMiddleware(int $index): callable
51-
{
52-
if (null === $this->indexedMiddlewareHandlers) {
53-
$this->indexedMiddlewareHandlers = \is_array($this->middlewareHandlers) ? array_values($this->middlewareHandlers) : iterator_to_array($this->middlewareHandlers, false);
59+
while ($middlewareIterator instanceof \IteratorAggregate) {
60+
$middlewareIterator = $middlewareIterator->getIterator();
5461
}
62+
$middlewareIterator->rewind();
5563

56-
if (!isset($this->indexedMiddlewareHandlers[$index])) {
57-
return static function () {};
64+
if (!$middlewareIterator->valid()) {
65+
return;
5866
}
67+
$next = static function (Envelope $envelope) use ($middlewareIterator, &$next) {
68+
$middlewareIterator->next();
5969

60-
return function (Envelope $envelope) use ($index) {
61-
$this->indexedMiddlewareHandlers[$index]->handle($envelope, $this->callableForNextMiddleware($index + 1));
70+
if ($middlewareIterator->valid()) {
71+
$middlewareIterator->current()->handle($envelope, $next);
72+
}
6273
};
74+
75+
$middlewareIterator->current()->handle($message instanceof Envelope ? $message : new Envelope($message), $next);
6376
}
6477
}

src/Symfony/Component/Messenger/Tests/DependencyInjection/MessengerPassTest.php

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -90,10 +90,10 @@ public function testProcessHandlersByBus()
9090
->setAbstract(true)
9191
;
9292

93-
$middlewares = array(array('id' => 'call_message_handler'));
93+
$middlewareHandlers = array(array('id' => 'call_message_handler'));
9494

95-
$container->setParameter($commandBusId.'.middleware', $middlewares);
96-
$container->setParameter($queryBusId.'.middleware', $middlewares);
95+
$container->setParameter($commandBusId.'.middleware', $middlewareHandlers);
96+
$container->setParameter($queryBusId.'.middleware', $middlewareHandlers);
9797

9898
$container->register(DummyCommandHandler::class)->addTag('messenger.message_handler', array('bus' => $commandBusId));
9999
$container->register(DummyQueryHandler::class)->addTag('messenger.message_handler', array('bus' => $queryBusId));
@@ -607,10 +607,10 @@ public function testItRegistersTheDebugCommand()
607607

608608
$container->register('console.command.messenger_debug', DebugCommand::class)->addArgument(array());
609609

610-
$middlewares = array(array('id' => 'call_message_handler'));
610+
$middlewareHandlers = array(array('id' => 'call_message_handler'));
611611

612-
$container->setParameter($commandBusId.'.middleware', $middlewares);
613-
$container->setParameter($queryBusId.'.middleware', $middlewares);
612+
$container->setParameter($commandBusId.'.middleware', $middlewareHandlers);
613+
$container->setParameter($queryBusId.'.middleware', $middlewareHandlers);
614614

615615
$container->register(DummyCommandHandler::class)->addTag('messenger.message_handler', array('bus' => $commandBusId));
616616
$container->register(DummyQueryHandler::class)->addTag('messenger.message_handler', array('bus' => $queryBusId));

src/Symfony/Component/Messenger/Tests/MessageBusTest.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,8 +30,8 @@ public function testItHasTheRightInterface()
3030
}
3131

3232
/**
33-
* @expectedException \Symfony\Component\Messenger\Exception\InvalidArgumentException
34-
* @expectedExceptionMessage Invalid type for message argument. Expected object, but got "string".
33+
* @expectedException \TypeError
34+
* @expectedExceptionMessage Invalid argument provided to "Symfony\Component\Messenger\MessageBus::dispatch()": expected object, but got string.
3535
*/
3636
public function testItDispatchInvalidMessageType()
3737
{

0 commit comments

Comments
 (0)
0