Skip to content

Commit fbb2093

Browse files
committed
[Messenger] Improve error message when routing to an invalid transport (closes #31613)
1 parent 046984e commit fbb2093

11 files changed

+89
-18
lines changed

DependencyInjection/FrameworkExtension.php

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1774,6 +1774,16 @@ private function registerMessengerConfiguration(array $config, ContainerBuilder
17741774
}
17751775
}
17761776

1777+
$senderReferences = [];
1778+
// alias => service_id
1779+
foreach ($senderAliases as $alias => $serviceId) {
1780+
$senderReferences[$alias] = new Reference($serviceId);
1781+
}
1782+
// service_id => service_id
1783+
foreach ($senderAliases as $serviceId) {
1784+
$senderReferences[$serviceId] = new Reference($serviceId);
1785+
}
1786+
17771787
$messageToSendersMapping = [];
17781788
foreach ($config['routing'] as $message => $messageConfiguration) {
17791789
if ('*' !== $message && !class_exists($message) && !interface_exists($message, false)) {
@@ -1782,19 +1792,14 @@ private function registerMessengerConfiguration(array $config, ContainerBuilder
17821792

17831793
// make sure senderAliases contains all senders
17841794
foreach ($messageConfiguration['senders'] as $sender) {
1785-
if (!isset($senderAliases[$sender])) {
1786-
$senderAliases[$sender] = $sender;
1795+
if (!isset($senderReferences[$sender])) {
1796+
throw new LogicException(sprintf('Invalid Messenger routing configuration: the "%s" class is being routed to a sender called "%s". This is not a valid transport or service id.', $message, $sender));
17871797
}
17881798
}
17891799

17901800
$messageToSendersMapping[$message] = $messageConfiguration['senders'];
17911801
}
17921802

1793-
$senderReferences = [];
1794-
foreach ($senderAliases as $alias => $serviceId) {
1795-
$senderReferences[$alias] = new Reference($serviceId);
1796-
}
1797-
17981803
$container->getDefinition('messenger.senders_locator')
17991804
->replaceArgument(0, $messageToSendersMapping)
18001805
->replaceArgument(1, ServiceLocatorTagPass::register($container, $senderReferences))

Tests/DependencyInjection/Fixtures/php/messenger.php

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,5 +9,10 @@
99
FooMessage::class => ['sender.bar', 'sender.biz'],
1010
BarMessage::class => 'sender.foo',
1111
],
12+
'transports' => [
13+
'sender.biz' => 'null://',
14+
'sender.bar' => 'null://',
15+
'sender.foo' => 'null://',
16+
],
1217
],
1318
]);

Tests/DependencyInjection/Fixtures/php/messenger_routing.php

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,14 +7,15 @@
77
'default_serializer' => 'messenger.transport.symfony_serializer',
88
],
99
'routing' => [
10-
'Symfony\Bundle\FrameworkBundle\Tests\Fixtures\Messenger\DummyMessage' => ['amqp', 'audit'],
10+
'Symfony\Bundle\FrameworkBundle\Tests\Fixtures\Messenger\DummyMessage' => ['amqp', 'messenger.transport.audit'],
1111
'Symfony\Bundle\FrameworkBundle\Tests\Fixtures\Messenger\SecondMessage' => [
1212
'senders' => ['amqp', 'audit'],
1313
],
1414
'*' => 'amqp',
1515
],
1616
'transports' => [
1717
'amqp' => 'amqp://localhost/%2f/messages',
18+
'audit' => 'null://',
1819
],
1920
],
2021
]);
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
<?php
2+
3+
$container->loadFromExtension('framework', [
4+
'serializer' => true,
5+
'messenger' => [
6+
'serializer' => [
7+
'default_serializer' => 'messenger.transport.symfony_serializer',
8+
],
9+
'routing' => [
10+
'Symfony\Bundle\FrameworkBundle\Tests\Fixtures\Messenger\DummyMessage' => 'invalid',
11+
],
12+
'transports' => [
13+
'amqp' => 'amqp://localhost/%2f/messages',
14+
],
15+
],
16+
]);

Tests/DependencyInjection/Fixtures/xml/messenger.xml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,9 @@
1414
<framework:routing message-class="Symfony\Bundle\FrameworkBundle\Tests\Fixtures\Messenger\BarMessage">
1515
<framework:sender service="sender.foo" />
1616
</framework:routing>
17+
<framework:transport name="sender.bar" dsn="null://" />
18+
<framework:transport name="sender.biz" dsn="null://" />
19+
<framework:transport name="sender.foo" dsn="null://" />
1720
</framework:messenger>
1821
</framework:config>
1922
</container>

Tests/DependencyInjection/Fixtures/xml/messenger_routing.xml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
<framework:serializer default-serializer="messenger.transport.symfony_serializer" />
1212
<framework:routing message-class="Symfony\Bundle\FrameworkBundle\Tests\Fixtures\Messenger\DummyMessage">
1313
<framework:sender service="amqp" />
14-
<framework:sender service="audit" />
14+
<framework:sender service="messenger.transport.audit" />
1515
</framework:routing>
1616
<framework:routing message-class="Symfony\Bundle\FrameworkBundle\Tests\Fixtures\Messenger\SecondMessage">
1717
<framework:sender service="amqp" />
@@ -21,6 +21,7 @@
2121
<framework:sender service="amqp" />
2222
</framework:routing>
2323
<framework:transport name="amqp" dsn="amqp://localhost/%2f/messages" />
24+
<framework:transport name="audit" dsn="null://" />
2425
</framework:messenger>
2526
</framework:config>
2627
</container>
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
<?xml version="1.0" encoding="utf-8" ?>
2+
<container xmlns="http://symfony.com/schema/dic/services"
3+
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
4+
xmlns:framework="http://symfony.com/schema/dic/symfony"
5+
xsi:schemaLocation="http://symfony.com/schema/dic/services https://symfony.com/schema/dic/services/services-1.0.xsd
6+
http://symfony.com/schema/dic/symfony https://symfony.com/schema/dic/symfony/symfony-1.0.xsd">
7+
8+
<framework:config>
9+
<framework:serializer enabled="true" />
10+
<framework:messenger>
11+
<framework:serializer default-serializer="messenger.transport.symfony_serializer" />
12+
<framework:routing message-class="Symfony\Bundle\FrameworkBundle\Tests\Fixtures\Messenger\DummyMessage">
13+
<framework:sender service="invalid" />
14+
</framework:routing>
15+
<framework:routing message-class="Symfony\Bundle\FrameworkBundle\Tests\Fixtures\Messenger\SecondMessage">
16+
<framework:sender service="amqp" />
17+
<framework:sender service="audit" />
18+
</framework:routing>
19+
<framework:transport name="amqp" dsn="amqp://localhost/%2f/messages" />
20+
</framework:messenger>
21+
</framework:config>
22+
</container>

Tests/DependencyInjection/Fixtures/yml/messenger.yml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,3 +3,7 @@ framework:
33
routing:
44
'Symfony\Bundle\FrameworkBundle\Tests\Fixtures\Messenger\FooMessage': ['sender.bar', 'sender.biz']
55
'Symfony\Bundle\FrameworkBundle\Tests\Fixtures\Messenger\BarMessage': 'sender.foo'
6+
transports:
7+
sender.biz: 'null://'
8+
sender.bar: 'null://'
9+
sender.foo: 'null://'

Tests/DependencyInjection/Fixtures/yml/messenger_routing.yml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,10 @@ framework:
44
serializer:
55
default_serializer: messenger.transport.symfony_serializer
66
routing:
7-
'Symfony\Bundle\FrameworkBundle\Tests\Fixtures\Messenger\DummyMessage': [amqp, audit]
7+
'Symfony\Bundle\FrameworkBundle\Tests\Fixtures\Messenger\DummyMessage': [amqp, messenger.transport.audit]
88
'Symfony\Bundle\FrameworkBundle\Tests\Fixtures\Messenger\SecondMessage':
99
senders: [amqp, audit]
1010
'*': amqp
1111
transports:
1212
amqp: 'amqp://localhost/%2f/messages'
13+
audit: 'null://'
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
framework:
2+
serializer: true
3+
messenger:
4+
serializer:
5+
default_serializer: messenger.transport.symfony_serializer
6+
routing:
7+
'Symfony\Bundle\FrameworkBundle\Tests\Fixtures\Messenger\DummyMessage': invalid
8+
transports:
9+
amqp: 'amqp://localhost/%2f/messages'

Tests/DependencyInjection/FrameworkExtensionTest.php

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -668,8 +668,8 @@ public function testMessenger()
668668
$this->assertTrue($container->getAlias('message_bus')->isPublic());
669669
$this->assertTrue($container->hasAlias('messenger.default_bus'));
670670
$this->assertTrue($container->getAlias('messenger.default_bus')->isPublic());
671-
$this->assertFalse($container->hasDefinition('messenger.transport.amqp.factory'));
672-
$this->assertFalse($container->hasDefinition('messenger.transport.redis.factory'));
671+
$this->assertTrue($container->hasDefinition('messenger.transport.amqp.factory'));
672+
$this->assertTrue($container->hasDefinition('messenger.transport.redis.factory'));
673673
$this->assertTrue($container->hasDefinition('messenger.transport_factory'));
674674
$this->assertSame(TransportFactory::class, $container->getDefinition('messenger.transport_factory')->getClass());
675675
}
@@ -712,14 +712,11 @@ public function testMessengerRouting()
712712
$senderLocatorDefinition = $container->getDefinition('messenger.senders_locator');
713713

714714
$sendersMapping = $senderLocatorDefinition->getArgument(0);
715-
$this->assertEquals([
716-
'amqp',
717-
'audit',
718-
], $sendersMapping[DummyMessage::class]);
715+
$this->assertEquals(['amqp', 'messenger.transport.audit'], $sendersMapping[DummyMessage::class]);
719716
$sendersLocator = $container->getDefinition((string) $senderLocatorDefinition->getArgument(1));
720-
$this->assertSame(['amqp', 'audit'], array_keys($sendersLocator->getArgument(0)));
717+
$this->assertSame(['amqp', 'audit', 'messenger.transport.amqp', 'messenger.transport.audit'], array_keys($sendersLocator->getArgument(0)));
721718
$this->assertEquals(new Reference('messenger.transport.amqp'), $sendersLocator->getArgument(0)['amqp']->getValues()[0]);
722-
$this->assertEquals(new Reference('audit'), $sendersLocator->getArgument(0)['audit']->getValues()[0]);
719+
$this->assertEquals(new Reference('messenger.transport.audit'), $sendersLocator->getArgument(0)['messenger.transport.audit']->getValues()[0]);
723720
}
724721

725722
public function testMessengerTransportConfiguration()
@@ -776,6 +773,13 @@ public function testMessengerMiddlewareFactoryErroneousFormat()
776773
$this->createContainerFromFile('messenger_middleware_factory_erroneous_format');
777774
}
778775

776+
public function testMessengerInvalidTransportRouting()
777+
{
778+
$this->expectException('LogicException');
779+
$this->expectExceptionMessage('Invalid Messenger routing configuration: the "Symfony\Bundle\FrameworkBundle\Tests\Fixtures\Messenger\DummyMessage" class is being routed to a sender called "invalid". This is not a valid transport or service id.');
780+
$this->createContainerFromFile('messenger_routing_invalid_transport');
781+
}
782+
779783
public function testTranslator()
780784
{
781785
$container = $this->createContainerFromFile('full');

0 commit comments

Comments
 (0)