From acae5cada21b4c0505a9d49d7ed4d99804831a2f Mon Sep 17 00:00:00 2001 From: Wouter de Jong Date: Sat, 5 Nov 2022 18:20:29 +0100 Subject: [PATCH] [Messenger] Do not return fallback senders when other senders were already found --- .../Transport/Sender/SendersLocatorTest.php | 17 +++++++++++++++++ .../Transport/Sender/SendersLocator.php | 6 ++++++ 2 files changed, 23 insertions(+) diff --git a/src/Symfony/Component/Messenger/Tests/Transport/Sender/SendersLocatorTest.php b/src/Symfony/Component/Messenger/Tests/Transport/Sender/SendersLocatorTest.php index d58a4d63d50aa..3faab44d0696a 100644 --- a/src/Symfony/Component/Messenger/Tests/Transport/Sender/SendersLocatorTest.php +++ b/src/Symfony/Component/Messenger/Tests/Transport/Sender/SendersLocatorTest.php @@ -52,6 +52,23 @@ public function testItReturnsTheSenderBasedOnTransportNamesStamp() $this->assertSame([], iterator_to_array($locator->getSenders(new Envelope(new SecondMessage())))); } + public function testSendersMapWithFallback() + { + $firstSender = $this->createMock(SenderInterface::class); + $secondSender = $this->createMock(SenderInterface::class); + $sendersLocator = $this->createContainer([ + 'first' => $firstSender, + 'second' => $secondSender, + ]); + $locator = new SendersLocator([ + DummyMessage::class => ['first'], + '*' => ['second'], + ], $sendersLocator); + + $this->assertSame(['first' => $firstSender], iterator_to_array($locator->getSenders(new Envelope(new DummyMessage('a')))), 'Unexpected senders for configured message'); + $this->assertSame(['second' => $secondSender], iterator_to_array($locator->getSenders(new Envelope(new SecondMessage()))), 'Unexpected senders for unconfigured message'); + } + private function createContainer(array $senders): ContainerInterface { $container = $this->createMock(ContainerInterface::class); diff --git a/src/Symfony/Component/Messenger/Transport/Sender/SendersLocator.php b/src/Symfony/Component/Messenger/Transport/Sender/SendersLocator.php index 5de6936d591f7..3420a6cc6043a 100644 --- a/src/Symfony/Component/Messenger/Transport/Sender/SendersLocator.php +++ b/src/Symfony/Component/Messenger/Transport/Sender/SendersLocator.php @@ -51,6 +51,12 @@ public function getSenders(Envelope $envelope): iterable foreach (HandlersLocator::listTypes($envelope) as $type) { foreach ($this->sendersMap[$type] ?? [] as $senderAlias) { + if (str_ends_with($type, '*') && $seen) { + // the '*' acts as a fallback, if other senders already matched + // with previous types, skip the senders bound to the fallback + continue; + } + if (!\in_array($senderAlias, $seen, true)) { $seen[] = $senderAlias;