8000 Fixed return senders based on the message parents/interfaces · sroze/symfony@41e25ab · GitHub
[go: up one dir, main page]

Skip to content

Commit 41e25ab

Browse files
committed
Fixed return senders based on the message parents/interfaces
1 parent 64a4a2b commit 41e25ab

File tree

4 files changed

+75
-8
lines changed

4 files changed

+75
-8
lines changed

src/Symfony/Component/Messenger/Asynchronous/Routing/SenderLocator.php

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -32,13 +32,29 @@ public function __construct(ContainerInterface $senderServiceLocator, array $mes
3232
*/
3333
public function getSendersForMessage($message): array
3434
{
35-
$senderIds = $this->messageToSenderIdsMapping[\get_class($message)] ?? $this->messageToSenderIdsMapping['*'] ?? array();
36-
3735
$senders = array();
38-
foreach ($senderIds as $senderId) {
36+
foreach ($this->getSenderIds($message) as $senderId) {
3937
$senders[] = $this->senderServiceLocator->get($senderId);
4038
}
4139

4240
return $senders;
4341
}
42+
43+
private function getSenderIds($message): array
44+
{
45+
if (isset($this->messageToSenderIdsMapping[\get_class($message)])) {
46+
return $this->messageToSenderIdsMapping[\get_class($message)];
47+
}
48+
if ($messageToSenderIdsMapping = array_intersect_key($this->messageToSenderIdsMapping, class_parents($message))) {
49+
return current($messageToSenderIdsMapping);
50+
}
51+
if ($messageToSenderIdsMapping = array_intersect_key($this->messageToSenderIdsMapping, class_implements($message))) {
52+
return current($messageToSenderIdsMapping);
53+
}
54+
if (isset($this->messageToSenderIdsMapping['*'])) {
55+
return $this->messageToSenderIdsMapping['*'];
56+
}
57+
58+
return array();
59+
}
4460
}

src/Symfony/Component/Messenger/Tests/Asynchronous/Routing/SenderLocatorTest.php

Lines changed: 48 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
use Symfony\Component\DependencyInjection\Container;
1616
use Symfony\Component\Messenger\Asynchronous\Routing\SenderLocator;
1717
use Symfony\Component\Messenger\Tests\Fixtures\DummyMessage;
18+
use Symfony\Component\Messenger\Tests\Fixtures\DummyMessageInterface;
1819
use Symfony\Component\Messenger\Tests\Fixtures\SecondMessage;
1920
use Symfony\Component\Messenger\Transport\SenderInterface;
2021

@@ -32,8 +33,47 @@ public function testItReturnsTheSenderBasedOnTheMessageClass()
3233
),
3334
));
3435

35-
$this->assertEquals(array($sender), $locator->getSendersForMessage(new DummyMessage('Hello')));
36-
$this->assertEquals(array(), $locator->getSendersForMessage(new SecondMessage()));
36+
$this->assertSame(array($sender), $locator->getSendersForMessage(new DummyMessage('Hello')));
37+
$this->assertSame(array(), $locator->getSendersForMessage(new SecondMessage()));
38+
}
39+
40+
public function testItReturnsTheSenderBasedOnTheMessageParentClass()
41+
{
42+
$container = new Container();
43+
44+
$sender = $this->getMockBuilder(SenderInterface::class)->getMock();
45+
$container->set('my_amqp_sender', $sender);
46+
47+
$apiSender = $this->getMockBuilder(SenderInterface::class)->getMock();
48+
$container->set('my_api_sender', $apiSender);
49+
50+
$locator = new SenderLocator($container, array(
51+
DummyMessageInterface::class => array(
52+
'my_api_sender',
53+
),
54+
DummyMessage::class => array(
55+
'my_amqp_sender',
56+
),
57+
));
58+
$this->assertSame(array($sender), $locator->getSendersForMessage(new ChildDummyMessage('Hello')));
59+
$this->assertSame(array(), $locator->getSendersForMessage(new SecondMessage()));
60+
}
61+
62+
public function testItReturnsTheSenderBasedOnTheMessageInterface()
63+
{
64+
$container = new Container();
65+
66+
$sender = $this->getMockBuilder(SenderInterface::class)->getMock();
67+
$container->set('my_amqp_sender', $sender);
68+
69+
$locator = new SenderLocator($container, array(
70+
DummyMessageInterface::class => array(
71+
'my_amqp_sender',
72+
),
73+
));
74+
75+
$this->assertSame(array($sender), $locator->getSendersForMessage(new DummyMessage('Hello')));
76+
$this->assertSame(array(), $locator->getSendersForMessage(new SecondMessage()));
3777
}
3878

3979
public function testItSupportsAWildcardInsteadOfTheMessageClass()
@@ -55,7 +95,11 @@ public function testItSupportsAWildcardInsteadOfTheMessageClass()
5595
),
5696
));
5797

58-
$this->assertEquals(array($sender), $locator->getSendersForMessage(new DummyMessage('Hello')));
59-
$this->assertEquals(array($apiSender), $locator->getSendersForMessage(new SecondMessage()));
98+
$this->assertSame(array($sender), $locator->getSendersForMessage(new DummyMessage('Hello')));
99+
$this->assertSame(array($apiSender), $locator->getSendersForMessage(new SecondMessage()));
60100
}
61101
}
102+
103+
class ChildDummyMessage extends DummyMessage
104+
{
105+
}

src/Symfony/Component/Messenger/Tests/Fixtures/DummyMessage.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
namespace Symfony\Component\Messenger\Tests\Fixtures;
44

5-
class DummyMessage
5+
class DummyMessage implements DummyMessageInterface
66
{
77
private $message;
88

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
<?php
2+
3+
namespace Symfony\Component\Messenger\Tests\Fixtures;
4+
5+
interface DummyMessageInterface
6+
{
7+
}

0 commit comments

Comments
 (0)
0