Skip to content

Commit a1d2dfe

Browse files
committed
[Messenger] move send send and handle mapping to send middleware
1 parent 76708f6 commit a1d2dfe

File tree

12 files changed

+39
-58
lines changed

12 files changed

+39
-58
lines changed

src/Symfony/Bundle/FrameworkBundle/DependencyInjection/FrameworkExtension.php

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1502,7 +1502,7 @@ private function registerMessengerConfiguration(array $config, ContainerBuilder
15021502
if (1 < count($messageConfiguration['senders'])) {
15031503
$senders = array_map(function ($sender) { return new Reference($sender); }, $messageConfiguration['senders']);
15041504
$chainSenderDefinition = new Definition(ChainSender::class, array($senders));
1505-
$chainSenderId = 'messenger.chain_sender.'.$message;
1505+
$chainSenderId = '.messenger.chain_sender.'.$message;
15061506
$container->setDefinition($chainSenderId, $chainSenderDefinition);
15071507
$messageToSenderIdMapping[$message] = $chainSenderId;
15081508
} else {
@@ -1512,10 +1512,8 @@ private function registerMessengerConfiguration(array $config, ContainerBuilder
15121512
$messageToSendAndHandleMapping[$message] = $messageConfiguration['send_and_handle'];
15131513
}
15141514

1515-
$container->getDefinition('messenger.asynchronous.routing.sender_locator')
1516-
->replaceArgument(1, $messageToSenderIdMapping)
1517-
->replaceArgument(2, $messageToSendAndHandleMapping)
1518-
;
1515+
$container->getDefinition('messenger.asynchronous.routing.sender_locator')->replaceArgument(1, $messageToSenderIdMapping);
1516+
$container->getDefinition('messenger.middleware.route_messages')->replaceArgument(1, $messageToSendAndHandleMapping);
15191517

15201518
foreach ($config['transports'] as $name => $transport) {
15211519
if (0 === strpos($transport['dsn'], 'amqp://') && !$container->hasDefinition('messenger.transport.amqp.factory')) {

src/Symfony/Bundle/FrameworkBundle/Resources/config/messenger.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,10 +16,10 @@
1616
<service id="messenger.asynchronous.routing.sender_locator" class="Symfony\Component\Messenger\Asynchronous\Routing\SenderLocator">
1717
<argument type="service" id="messenger.sender_locator" />
1818
<argument type="collection" /> <!-- Message to sender ID mapping -->
19-
<argument type="collection" /> <!-- Message to send and handle mapping -->
2019
</service>
2120
<service id="messenger.middleware.route_messages" class="Symfony\Component\Messenger\Asynchronous\Middleware\SendMessageMiddleware">
2221
<argument type="service" id="messenger.asynchronous.routing.sender_locator" />
22+
<argument type="collection" /> <!-- Message to send and handle mapping -->
2323
</service>
2424

2525
<!-- Message encoding/decoding -->

src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Fixtures/php/messenger_routing.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
$container->loadFromExtension('framework', array(
44
'messenger' => array(
55
'routing' => array(
6-
'Symfony\Component\Messenger\Tests\Fixtures\DummyMessage' => array('amqp'),
6+
'Symfony\Component\Messenger\Tests\Fixtures\DummyMessage' => array('amqp', 'audit'),
77
'Symfony\Component\Messenger\Tests\Fixtures\SecondMessage' => array(
88
'senders' => array('amqp', 'audit'),
99
'send_and_handle' => true,

src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Fixtures/xml/messenger_routing.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
<framework:messenger>
1010
<framework:routing message-class="Symfony\Component\Messenger\Tests\Fixtures\DummyMessage">
1111
<framework:sender service="amqp" />
12+
<framework:sender service="audit" />
1213
</framework:routing>
1314
<framework:routing message-class="Symfony\Component\Messenger\Tests\Fixtures\SecondMessage" send-and-handle="true">
1415
<framework:sender service="amqp" />

src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Fixtures/yml/messenger_routing.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
framework:
22
messenger:
33
routing:
4-
'Symfony\Component\Messenger\Tests\Fixtures\DummyMessage': amqp
4+
'Symfony\Component\Messenger\Tests\Fixtures\DummyMessage': [amqp, audit]
55
'Symfony\Component\Messenger\Tests\Fixtures\SecondMessage':
66
senders: [amqp, audit]
77
send_and_handle: true

src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/FrameworkExtensionTest.php

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -555,10 +555,11 @@ public function testMessengerRouting()
555555
{
556556
$container = $this->createContainerFromFile('messenger_routing');
557557
$senderLocatorDefinition = $container->getDefinition('messenger.asynchronous.routing.sender_locator');
558+
$sendMessageMiddlewareDefinition = $container->getDefinition('messenger.middleware.route_messages');
558559

559560
$messageToSenderIdsMapping = array(
560-
DummyMessage::class => 'amqp',
561-
SecondMessage::class => 'messenger.chain_sender.'.SecondMessage::class,
561+
DummyMessage::class => '.messenger.chain_sender.'.DummyMessage::class,
562+
SecondMessage::class => '.messenger.chain_sender.'.SecondMessage::class,
562563
'*' => 'amqp',
563564
);
564565
$messageToSendAndHandleMapping = array(
@@ -568,7 +569,7 @@ public function testMessengerRouting()
568569
);
569570

570571
$this->assertSame($messageToSenderIdsMapping, $senderLocatorDefinition->getArgument(1));
571-
$this->assertSame($messageToSendAndHandleMapping, $senderLocatorDefinition->getArgument(2));
572+
$this->assertSame($messageToSendAndHandleMapping, $sendMessageMiddlewareDefinition->getArgument(1));
572573
}
573574

574575
/**

src/Symfony/Component/Messenger/Asynchronous/Middleware/SendMessageMiddleware.php

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,14 +17,17 @@
1717

1818
/**
1919
* @author Samuel Roze <samuel.roze@gmail.com>
20+
* @author Tobias Schultze <http://tobion.de>
2021
*/
2122
class SendMessageMiddleware implements MiddlewareInterface
2223
{
2324
private $senderLocator;
25+
private $messagesToSendAndHandleMapping;
2426

25-
public function __construct(SenderLocatorInterface $senderLocator)
27+
public function __construct(SenderLocatorInterface $senderLocator, array $messagesToSendAndHandleMapping = array())
2628
{
2729
$this->senderLocator = $senderLocator;
30+
$this->messagesToSendAndHandleMapping = $messagesToSendAndHandleMapping;
2831
}
2932

3033
/**
@@ -41,7 +44,7 @@ public function handle($message, callable $next)
4144
if ($sender) {
4245
$sender->send($message);
4346

44-
if (!$this->senderLocator->forwardToSenderAndHandler($message)) {
47+
if (!($this->messagesToSendAndHandleMapping[\get_class($message)] ?? $this->messagesToSendAndHandleMapping['*'] ?? false)) {
4548
return;
4649
}
4750
}

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

Lines changed: 1 addition & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -21,13 +21,11 @@ class SenderLocator implements SenderLocatorInterface
2121
{
2222
private $senderServiceLocator;
2323
private $messageToSenderIdMapping;
24-
private $messagesToSendAndHandleMapping;
2524

26-
public function __construct(ContainerInterface $senderServiceLocator, array $messageToSenderIdMapping, array $messagesToSendAndHandleMapping = array())
25+
public function __construct(ContainerInterface $senderServiceLocator, array $messageToSenderIdMapping)
2726
{
2827
$this->senderServiceLocator = $senderServiceLocator;
2928
$this->messageToSenderIdMapping = $messageToSenderIdMapping;
30-
$this->messagesToSendAndHandleMapping = $messagesToSendAndHandleMapping;
3129
}
3230

3331
/**
@@ -39,12 +37,4 @@ public function getSenderForMessage($message): ?SenderInterface
3937

4038
return $senderId ? $this->senderServiceLocator->get($senderId) : null;
4139
}
42-
43-
/**
44-
* {@inheritdoc}
45-
*/
46-
public function forwardToSenderAndHandler($message): bool
47-
{
48-
return $this->messagesToSendAndHandleMapping[\get_class($message)] ?? $this->messagesToSendAndHandleMapping['*'] ?? false;
49-
}
5040
}

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

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -29,13 +29,4 @@ interface SenderLocatorInterface
2929
* @return SenderInterface|null
3030
*/
3131
public function getSenderForMessage($message): ?SenderInterface;
32-
33-
/**
34-
* Whether to route the message to a sender and still have it passed to its respective handler.
35-
*
36-
* @param object $message
37-
*
38-
* @return bool
39-
*/
40-
public function forwardToSenderAndHandler($message): bool;
4132
}

src/Symfony/Component/Messenger/Tests/Asynchronous/Middleware/SendMessageMiddlewareTest.php

Lines changed: 21 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -34,13 +34,31 @@ public function testItSendsTheMessageToAssignedSender()
3434
$middleware->handle($message, $next);
3535
}
3636

37-
public function testItAlsoCallsTheNextMiddlewareIfForwardToSenderAndHandler()
37+
public function testItAlsoCallsTheNextMiddlewareWithSendAndHandleMapping()
3838
{
3939
$message = new DummyMessage('Hey');
4040
$sender = $this->getMockBuilder(SenderInterface::class)->getMock();
4141
$next = $this->createPartialMock(\stdClass::class, array('__invoke'));
4242

43-
$middleware = new SendMessageMiddleware(new InMemorySenderLocator($sender, true));
43+
$middleware = new SendMessageMiddleware(new InMemorySenderLocator($sender), array(
44+
DummyMessage::class => true,
45+
));
46+
47+
$sender->expects($this->once())->method('send')->with($message);
48+
$next->expects($this->once())->method($this->anything());
49+
50+
$middleware->handle($message, $next);
51+
}
52+
53+
public function testItAlsoCallsTheNextMiddlewareIfWildcardMapping()
54+
{
55+
$message = new DummyMessage('Hey');
56+
$sender = $this->getMockBuilder(SenderInterface::class)->getMock();
57+
$next = $this->createPartialMock(\stdClass::class, array('__invoke'));
58+
59+
$middleware = new SendMessageMiddleware(new InMemorySenderLocator($sender), array(
60+
'*' => true,
61+
));
4462

4563
$sender->expects($this->once())->method('send')->with($message);
4664
$next->expects($this->once())->method($this->anything());
@@ -80,21 +98,14 @@ public function testItSkipsReceivedMessages()
8098
class InMemorySenderLocator implements SenderLocatorInterface
8199
{
82100
private $sender;
83-
private $sendAndHandle;
84101

85-
public function __construct(?SenderInterface $sender, bool $sendAndHandle = false)
102+
public function __construct(?SenderInterface $sender)
86103
{
87104
$this->sender = $sender;
88-
$this->sendAndHandle = $sendAndHandle;
89105
}
90106

91107
public function getSenderForMessage($message): ?SenderInterface
92108
{
93109
return $this->sender;
94110
}
95-
96-
public function forwardToSenderAndHandler($message): bool
97-
{
98-
return $this->sendAndHandle;
99-
}
100111
}

0 commit comments

Comments
 (0)