Skip to content

Commit a5779f0

Browse files
committed
Chaining senders with their aliases should work
1 parent b6541d1 commit a5779f0

File tree

5 files changed

+33
-15
lines changed

5 files changed

+33
-15
lines changed

DependencyInjection/FrameworkExtension.php

Lines changed: 20 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1495,6 +1495,22 @@ private function registerMessengerConfiguration(array $config, ContainerBuilder
14951495
throw new LogicException(sprintf('The default bus named "%s" is not defined. Define it or change the default bus name.', $config['default_bus']));
14961496
}
14971497

1498+
$senderAliases = array();
1499+
foreach ($config['transports'] as $name => $transport) {
1500+
if (0 === strpos($transport['dsn'], 'amqp://') && !$container->hasDefinition('messenger.transport.amqp.factory')) {
1501+
throw new LogicException('The default AMQP transport is not available. Make sure you have installed and enabled the Serializer component. Try enable it or install it by running "composer require symfony/serializer-pack".');
1502+
}
1503+
1504+
$transportDefinition = (new Definition(TransportInterface::class))
1505+
->setFactory(array(new Reference('messenger.transport_factory'), 'createTransport'))
1506+
->setArguments(array($transport['dsn'], $transport['options']))
1507+
->addTag('messenger.receiver', array('alias' => $name))
1508+
->addTag('messenger.sender', array('alias' => $name))
1509+
;
1510+
$container->setDefinition($transportId = 'messenger.transport.'.$name, $transportDefinition);
1511+
$senderAliases[$name] = $transportId;
1512+
}
1513+
14981514
$messageToSenderIdMapping = array();
14991515
$messageToSendAndHandleMapping = array();
15001516
foreach ($config['routing'] as $message => $messageConfiguration) {
@@ -1503,8 +1519,11 @@ private function registerMessengerConfiguration(array $config, ContainerBuilder
15031519
}
15041520

15051521
if (1 < \count($messageConfiguration['senders'])) {
1506-
$senders = array_map(function ($sender) { return new Reference($sender); }, $messageConfiguration['senders']);
1522+
$senders = array_map(function ($sender) use ($senderAliases) {
1523+
return new Reference($senderAliases[$sender] ?? $sender);
1524+
}, $messageConfiguration['senders']);
15071525
$chainSenderDefinition = new Definition(ChainSender::class, array($senders));
1526+
$chainSenderDefinition->addTag('messenger.sender');
15081527
$chainSenderId = '.messenger.chain_sender.'.$message;
15091528
$container->setDefinition($chainSenderId, $chainSenderDefinition);
15101529
$messageToSenderIdMapping[$message] = $chainSenderId;
@@ -1517,20 +1536,6 @@ private function registerMessengerConfiguration(array $config, ContainerBuilder
15171536

15181537
$container->getDefinition('messenger.asynchronous.routing.sender_locator')->replaceArgument(1, $messageToSenderIdMapping);
15191538
$container->getDefinition('messenger.middleware.route_messages')->replaceArgument(1, $messageToSendAndHandleMapping);
1520-
1521-
foreach ($config['transports'] as $name => $transport) {
1522-
if (0 === strpos($transport['dsn'], 'amqp://') && !$container->hasDefinition('messenger.transport.amqp.factory')) {
1523-
throw new LogicException('The default AMQP transport is not available. Make sure you have installed and enabled the Serializer component. Try enable it or install it by running "composer require symfony/serializer-pack".');
1524-
}
1525-
1526-
$transportDefinition = (new Definition(TransportInterface::class))
1527-
->setFactory(array(new Reference('messenger.transport_factory'), 'createTransport'))
1528-
->setArguments(array($transport['dsn'], $transport['options']))
1529-
->addTag('messenger.receiver', array('alias' => $name))
1530-
->addTag('messenger.sender', array('alias' => $name))
1531-
;
1532-
$container->setDefinition('messenger.transport.'.$name, $transportDefinition);
1533-
}
15341539
}
15351540

15361541
private function registerCacheConfiguration(array $config, ContainerBuilder $container)

Tests/DependencyInjection/Fixtures/php/messenger_routing.php

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
<?php
22

33
$container->loadFromExtension('framework', array(
4+
'serializer' => true,
45
'messenger' => array(
6+
'serializer' => true,
57
'routing' => array(
68
'Symfony\Component\Messenger\Tests\Fixtures\DummyMessage' => array('amqp', 'audit'),
79
'Symfony\Component\Messenger\Tests\Fixtures\SecondMessage' => array(
@@ -10,5 +12,8 @@
1012
),
1113
'*' => 'amqp',
1214
),
15+
'transports' => array(
16+
'amqp' => 'amqp://localhost/%2f/messages',
17+
),
1318
),
1419
));

Tests/DependencyInjection/Fixtures/xml/messenger_routing.xml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,9 @@
66
http://symfony.com/schema/dic/symfony http://symfony.com/schema/dic/symfony/symfony-1.0.xsd">
77

88
<framework:config>
9+
<framework:serializer enabled="true" />
910
<framework:messenger>
11+
<framework:serializer enabled="true" />
1012
<framework:routing message-class="Symfony\Component\Messenger\Tests\Fixtures\DummyMessage">
1113
<framework:sender service="amqp" />
1214
<framework:sender service="audit" />
@@ -18,6 +20,7 @@
1820
<framework:routing message-class="*">
1921
<framework:sender service="amqp" />
2022
</framework:routing>
23+
<framework:transport name="amqp" dsn="amqp://localhost/%2f/messages" />
2124
</framework:messenger>
2225
</framework:config>
2326
</container>
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,12 @@
11
framework:
2+
serializer: true
23
messenger:
4+
serializer: true
35
routing:
46
'Symfony\Component\Messenger\Tests\Fixtures\DummyMessage': [amqp, audit]
57
'Symfony\Component\Messenger\Tests\Fixtures\SecondMessage':
68
senders: [amqp, audit]
79
send_and_handle: true
810
'*': amqp
11+
transports:
12+
amqp: 'amqp://localhost/%2f/messages'

Tests/DependencyInjection/FrameworkExtensionTest.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -573,6 +573,7 @@ public function testMessengerRouting()
573573

574574
$this->assertSame($messageToSenderIdsMapping, $senderLocatorDefinition->getArgument(1));
575575
$this->assertSame($messageToSendAndHandleMapping, $sendMessageMiddlewareDefinition->getArgument(1));
576+
$this->assertEquals(array(new Reference('messenger.transport.amqp'), new Reference('audit')), $container->getDefinition('.messenger.chain_sender.'.DummyMessage::class)->getArgument(0));
576577
}
577578

578579
/**

0 commit comments

Comments
 (0)