diff --git a/src/Symfony/Component/Messenger/Asynchronous/Routing/SenderLocator.php b/src/Symfony/Component/Messenger/Asynchronous/Routing/SenderLocator.php index 9b62457626c5f..506fe234c6cef 100644 --- a/src/Symfony/Component/Messenger/Asynchronous/Routing/SenderLocator.php +++ b/src/Symfony/Component/Messenger/Asynchronous/Routing/SenderLocator.php @@ -32,13 +32,29 @@ public function __construct(ContainerInterface $senderServiceLocator, array $mes */ public function getSendersForMessage($message): array { - $senderIds = $this->messageToSenderIdsMapping[\get_class($message)] ?? $this->messageToSenderIdsMapping['*'] ?? array(); - $senders = array(); - foreach ($senderIds as $senderId) { + foreach ($this->getSenderIds($message) as $senderId) { $senders[] = $this->senderServiceLocator->get($senderId); } return $senders; } + + private function getSenderIds($message): array + { + if (isset($this->messageToSenderIdsMapping[\get_class($message)])) { + return $this->messageToSenderIdsMapping[\get_class($message)]; + } + if ($messageToSenderIdsMapping = array_intersect_key($this->messageToSenderIdsMapping, class_parents($message))) { + return current($messageToSenderIdsMapping); + } + if ($messageToSenderIdsMapping = array_intersect_key($this->messageToSenderIdsMapping, class_implements($message))) { + return current($messageToSenderIdsMapping); + } + if (isset($this->messageToSenderIdsMapping['*'])) { + return $this->messageToSenderIdsMapping['*']; + } + + return array(); + } } diff --git a/src/Symfony/Component/Messenger/Tests/Asynchronous/Routing/SenderLocatorTest.php b/src/Symfony/Component/Messenger/Tests/Asynchronous/Routing/SenderLocatorTest.php index caf952526439a..6278be85c57dc 100644 --- a/src/Symfony/Component/Messenger/Tests/Asynchronous/Routing/SenderLocatorTest.php +++ b/src/Symfony/Component/Messenger/Tests/Asynchronous/Routing/SenderLocatorTest.php @@ -15,6 +15,7 @@ use Symfony\Component\DependencyInjection\Container; use Symfony\Component\Messenger\Asynchronous\Routing\SenderLocator; use Symfony\Component\Messenger\Tests\Fixtures\DummyMessage; +use Symfony\Component\Messenger\Tests\Fixtures\DummyMessageInterface; use Symfony\Component\Messenger\Tests\Fixtures\SecondMessage; use Symfony\Component\Messenger\Transport\SenderInterface; @@ -32,8 +33,47 @@ public function testItReturnsTheSenderBasedOnTheMessageClass() ), )); - $this->assertEquals(array($sender), $locator->getSendersForMessage(new DummyMessage('Hello'))); - $this->assertEquals(array(), $locator->getSendersForMessage(new SecondMessage())); + $this->assertSame(array($sender), $locator->getSendersForMessage(new DummyMessage('Hello'))); + $this->assertSame(array(), $locator->getSendersForMessage(new SecondMessage())); + } + + public function testItReturnsTheSenderBasedOnTheMessageParentClass() + { + $container = new Container(); + + $sender = $this->getMockBuilder(SenderInterface::class)->getMock(); + $container->set('my_amqp_sender', $sender); + + $apiSender = $this->getMockBuilder(SenderInterface::class)->getMock(); + $container->set('my_api_sender', $apiSender); + + $locator = new SenderLocator($container, array( + DummyMessageInterface::class => array( + 'my_api_sender', + ), + DummyMessage::class => array( + 'my_amqp_sender', + ), + )); + $this->assertSame(array($sender), $locator->getSendersForMessage(new ChildDummyMessage('Hello'))); + $this->assertSame(array(), $locator->getSendersForMessage(new SecondMessage())); + } + + public function testItReturnsTheSenderBasedOnTheMessageInterface() + { + $container = new Container(); + + $sender = $this->getMockBuilder(SenderInterface::class)->getMock(); + $container->set('my_amqp_sender', $sender); + + $locator = new SenderLocator($container, array( + DummyMessageInterface::class => array( + 'my_amqp_sender', + ), + )); + + $this->assertSame(array($sender), $locator->getSendersForMessage(new DummyMessage('Hello'))); + $this->assertSame(array(), $locator->getSendersForMessage(new SecondMessage())); } public function testItSupportsAWildcardInsteadOfTheMessageClass() @@ -55,7 +95,11 @@ public function testItSupportsAWildcardInsteadOfTheMessageClass() ), )); - $this->assertEquals(array($sender), $locator->getSendersForMessage(new DummyMessage('Hello'))); - $this->assertEquals(array($apiSender), $locator->getSendersForMessage(new SecondMessage())); + $this->assertSame(array($sender), $locator->getSendersForMessage(new DummyMessage('Hello'))); + $this->assertSame(array($apiSender), $locator->getSendersForMessage(new SecondMessage())); } } + +class ChildDummyMessage extends DummyMessage +{ +} diff --git a/src/Symfony/Component/Messenger/Tests/Fixtures/DummyMessage.php b/src/Symfony/Component/Messenger/Tests/Fixtures/DummyMessage.php index fb02ca7b866ae..2a9c70b1c5349 100644 --- a/src/Symfony/Component/Messenger/Tests/Fixtures/DummyMessage.php +++ b/src/Symfony/Component/Messenger/Tests/Fixtures/DummyMessage.php @@ -2,7 +2,7 @@ namespace Symfony\Component\Messenger\Tests\Fixtures; -class DummyMessage +class DummyMessage implements DummyMessageInterface { private $message; diff --git a/src/Symfony/Component/Messenger/Tests/Fixtures/DummyMessageInterface.php b/src/Symfony/Component/Messenger/Tests/Fixtures/DummyMessageInterface.php new file mode 100644 index 0000000000000..557b958ddc62e --- /dev/null +++ b/src/Symfony/Component/Messenger/Tests/Fixtures/DummyMessageInterface.php @@ -0,0 +1,7 @@ +