From 41e25abf8cdf2cf7e91a1b1828cffc3aeca9c96e Mon Sep 17 00:00:00 2001 From: Yonel Ceruto Date: Mon, 7 May 2018 13:31:27 -0400 Subject: [PATCH] Fixed return senders based on the message parents/interfaces --- .../Asynchronous/Routing/SenderLocator.php | 22 ++++++-- .../Routing/SenderLocatorTest.php | 52 +++++++++++++++++-- .../Messenger/Tests/Fixtures/DummyMessage.php | 2 +- .../Tests/Fixtures/DummyMessageInterface.php | 7 +++ 4 files changed, 75 insertions(+), 8 deletions(-) create mode 100644 src/Symfony/Component/Messenger/Tests/Fixtures/DummyMessageInterface.php 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 @@ + pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy