[Messenger] Improve error message when routing to an invalid transport (closes #31613)
This commit is contained in:
parent
f5d3d5fe17
commit
7909092891
@ -1774,6 +1774,16 @@ class FrameworkExtension extends Extension
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$senderReferences = [];
|
||||||
|
// alias => service_id
|
||||||
|
foreach ($senderAliases as $alias => $serviceId) {
|
||||||
|
$senderReferences[$alias] = new Reference($serviceId);
|
||||||
|
}
|
||||||
|
// service_id => service_id
|
||||||
|
foreach ($senderAliases as $serviceId) {
|
||||||
|
$senderReferences[$serviceId] = new Reference($serviceId);
|
||||||
|
}
|
||||||
|
|
||||||
$messageToSendersMapping = [];
|
$messageToSendersMapping = [];
|
||||||
foreach ($config['routing'] as $message => $messageConfiguration) {
|
foreach ($config['routing'] as $message => $messageConfiguration) {
|
||||||
if ('*' !== $message && !class_exists($message) && !interface_exists($message, false)) {
|
if ('*' !== $message && !class_exists($message) && !interface_exists($message, false)) {
|
||||||
@ -1782,19 +1792,14 @@ class FrameworkExtension extends Extension
|
|||||||
|
|
||||||
// make sure senderAliases contains all senders
|
// make sure senderAliases contains all senders
|
||||||
foreach ($messageConfiguration['senders'] as $sender) {
|
foreach ($messageConfiguration['senders'] as $sender) {
|
||||||
if (!isset($senderAliases[$sender])) {
|
if (!isset($senderReferences[$sender])) {
|
||||||
$senderAliases[$sender] = $sender;
|
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));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
$messageToSendersMapping[$message] = $messageConfiguration['senders'];
|
$messageToSendersMapping[$message] = $messageConfiguration['senders'];
|
||||||
}
|
}
|
||||||
|
|
||||||
$senderReferences = [];
|
|
||||||
foreach ($senderAliases as $alias => $serviceId) {
|
|
||||||
$senderReferences[$alias] = new Reference($serviceId);
|
|
||||||
}
|
|
||||||
|
|
||||||
$container->getDefinition('messenger.senders_locator')
|
$container->getDefinition('messenger.senders_locator')
|
||||||
->replaceArgument(0, $messageToSendersMapping)
|
->replaceArgument(0, $messageToSendersMapping)
|
||||||
->replaceArgument(1, ServiceLocatorTagPass::register($container, $senderReferences))
|
->replaceArgument(1, ServiceLocatorTagPass::register($container, $senderReferences))
|
||||||
|
@ -9,5 +9,10 @@ $container->loadFromExtension('framework', [
|
|||||||
FooMessage::class => ['sender.bar', 'sender.biz'],
|
FooMessage::class => ['sender.bar', 'sender.biz'],
|
||||||
BarMessage::class => 'sender.foo',
|
BarMessage::class => 'sender.foo',
|
||||||
],
|
],
|
||||||
|
'transports' => [
|
||||||
|
'sender.biz' => 'null://',
|
||||||
|
'sender.bar' => 'null://',
|
||||||
|
'sender.foo' => 'null://',
|
||||||
|
],
|
||||||
],
|
],
|
||||||
]);
|
]);
|
||||||
|
@ -7,7 +7,7 @@ $container->loadFromExtension('framework', [
|
|||||||
'default_serializer' => 'messenger.transport.symfony_serializer',
|
'default_serializer' => 'messenger.transport.symfony_serializer',
|
||||||
],
|
],
|
||||||
'routing' => [
|
'routing' => [
|
||||||
'Symfony\Bundle\FrameworkBundle\Tests\Fixtures\Messenger\DummyMessage' => ['amqp', 'audit'],
|
'Symfony\Bundle\FrameworkBundle\Tests\Fixtures\Messenger\DummyMessage' => ['amqp', 'messenger.transport.audit'],
|
||||||
'Symfony\Bundle\FrameworkBundle\Tests\Fixtures\Messenger\SecondMessage' => [
|
'Symfony\Bundle\FrameworkBundle\Tests\Fixtures\Messenger\SecondMessage' => [
|
||||||
'senders' => ['amqp', 'audit'],
|
'senders' => ['amqp', 'audit'],
|
||||||
],
|
],
|
||||||
@ -15,6 +15,7 @@ $container->loadFromExtension('framework', [
|
|||||||
],
|
],
|
||||||
'transports' => [
|
'transports' => [
|
||||||
'amqp' => 'amqp://localhost/%2f/messages',
|
'amqp' => 'amqp://localhost/%2f/messages',
|
||||||
|
'audit' => 'null://',
|
||||||
],
|
],
|
||||||
],
|
],
|
||||||
]);
|
]);
|
||||||
|
@ -0,0 +1,16 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
$container->loadFromExtension('framework', [
|
||||||
|
'serializer' => true,
|
||||||
|
'messenger' => [
|
||||||
|
'serializer' => [
|
||||||
|
'default_serializer' => 'messenger.transport.symfony_serializer',
|
||||||
|
],
|
||||||
|
'routing' => [
|
||||||
|
'Symfony\Bundle\FrameworkBundle\Tests\Fixtures\Messenger\DummyMessage' => 'invalid',
|
||||||
|
],
|
||||||
|
'transports' => [
|
||||||
|
'amqp' => 'amqp://localhost/%2f/messages',
|
||||||
|
],
|
||||||
|
],
|
||||||
|
]);
|
@ -14,6 +14,9 @@
|
|||||||
<framework:routing message-class="Symfony\Bundle\FrameworkBundle\Tests\Fixtures\Messenger\BarMessage">
|
<framework:routing message-class="Symfony\Bundle\FrameworkBundle\Tests\Fixtures\Messenger\BarMessage">
|
||||||
<framework:sender service="sender.foo" />
|
<framework:sender service="sender.foo" />
|
||||||
</framework:routing>
|
</framework:routing>
|
||||||
|
<framework:transport name="sender.bar" dsn="null://" />
|
||||||
|
<framework:transport name="sender.biz" dsn="null://" />
|
||||||
|
<framework:transport name="sender.foo" dsn="null://" />
|
||||||
</framework:messenger>
|
</framework:messenger>
|
||||||
</framework:config>
|
</framework:config>
|
||||||
</container>
|
</container>
|
||||||
|
@ -11,7 +11,7 @@
|
|||||||
<framework:serializer default-serializer="messenger.transport.symfony_serializer" />
|
<framework:serializer default-serializer="messenger.transport.symfony_serializer" />
|
||||||
<framework:routing message-class="Symfony\Bundle\FrameworkBundle\Tests\Fixtures\Messenger\DummyMessage">
|
<framework:routing message-class="Symfony\Bundle\FrameworkBundle\Tests\Fixtures\Messenger\DummyMessage">
|
||||||
<framework:sender service="amqp" />
|
<framework:sender service="amqp" />
|
||||||
<framework:sender service="audit" />
|
<framework:sender service="messenger.transport.audit" />
|
||||||
</framework:routing>
|
</framework:routing>
|
||||||
<framework:routing message-class="Symfony\Bundle\FrameworkBundle\Tests\Fixtures\Messenger\SecondMessage">
|
<framework:routing message-class="Symfony\Bundle\FrameworkBundle\Tests\Fixtures\Messenger\SecondMessage">
|
||||||
<framework:sender service="amqp" />
|
<framework:sender service="amqp" />
|
||||||
@ -21,6 +21,7 @@
|
|||||||
<framework:sender service="amqp" />
|
<framework:sender service="amqp" />
|
||||||
</framework:routing>
|
</framework:routing>
|
||||||
<framework:transport name="amqp" dsn="amqp://localhost/%2f/messages" />
|
<framework:transport name="amqp" dsn="amqp://localhost/%2f/messages" />
|
||||||
|
<framework:transport name="audit" dsn="null://" />
|
||||||
</framework:messenger>
|
</framework:messenger>
|
||||||
</framework:config>
|
</framework:config>
|
||||||
</container>
|
</container>
|
||||||
|
@ -0,0 +1,22 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8" ?>
|
||||||
|
<container xmlns="http://symfony.com/schema/dic/services"
|
||||||
|
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
|
xmlns:framework="http://symfony.com/schema/dic/symfony"
|
||||||
|
xsi:schemaLocation="http://symfony.com/schema/dic/services https://symfony.com/schema/dic/services/services-1.0.xsd
|
||||||
|
http://symfony.com/schema/dic/symfony https://symfony.com/schema/dic/symfony/symfony-1.0.xsd">
|
||||||
|
|
||||||
|
<framework:config>
|
||||||
|
<framework:serializer enabled="true" />
|
||||||
|
<framework:messenger>
|
||||||
|
<framework:serializer default-serializer="messenger.transport.symfony_serializer" />
|
||||||
|
<framework:routing message-class="Symfony\Bundle\FrameworkBundle\Tests\Fixtures\Messenger\DummyMessage">
|
||||||
|
<framework:sender service="invalid" />
|
||||||
|
</framework:routing>
|
||||||
|
<framework:routing message-class="Symfony\Bundle\FrameworkBundle\Tests\Fixtures\Messenger\SecondMessage">
|
||||||
|
<framework:sender service="amqp" />
|
||||||
|
<framework:sender service="audit" />
|
||||||
|
</framework:routing>
|
||||||
|
<framework:transport name="amqp" dsn="amqp://localhost/%2f/messages" />
|
||||||
|
</framework:messenger>
|
||||||
|
</framework:config>
|
||||||
|
</container>
|
@ -3,3 +3,7 @@ framework:
|
|||||||
routing:
|
routing:
|
||||||
'Symfony\Bundle\FrameworkBundle\Tests\Fixtures\Messenger\FooMessage': ['sender.bar', 'sender.biz']
|
'Symfony\Bundle\FrameworkBundle\Tests\Fixtures\Messenger\FooMessage': ['sender.bar', 'sender.biz']
|
||||||
'Symfony\Bundle\FrameworkBundle\Tests\Fixtures\Messenger\BarMessage': 'sender.foo'
|
'Symfony\Bundle\FrameworkBundle\Tests\Fixtures\Messenger\BarMessage': 'sender.foo'
|
||||||
|
transports:
|
||||||
|
sender.biz: 'null://'
|
||||||
|
sender.bar: 'null://'
|
||||||
|
sender.foo: 'null://'
|
||||||
|
@ -4,9 +4,10 @@ framework:
|
|||||||
serializer:
|
serializer:
|
||||||
default_serializer: messenger.transport.symfony_serializer
|
default_serializer: messenger.transport.symfony_serializer
|
||||||
routing:
|
routing:
|
||||||
'Symfony\Bundle\FrameworkBundle\Tests\Fixtures\Messenger\DummyMessage': [amqp, audit]
|
'Symfony\Bundle\FrameworkBundle\Tests\Fixtures\Messenger\DummyMessage': [amqp, messenger.transport.audit]
|
||||||
'Symfony\Bundle\FrameworkBundle\Tests\Fixtures\Messenger\SecondMessage':
|
'Symfony\Bundle\FrameworkBundle\Tests\Fixtures\Messenger\SecondMessage':
|
||||||
senders: [amqp, audit]
|
senders: [amqp, audit]
|
||||||
'*': amqp
|
'*': amqp
|
||||||
transports:
|
transports:
|
||||||
amqp: 'amqp://localhost/%2f/messages'
|
amqp: 'amqp://localhost/%2f/messages'
|
||||||
|
audit: 'null://'
|
||||||
|
@ -0,0 +1,9 @@
|
|||||||
|
framework:
|
||||||
|
serializer: true
|
||||||
|
messenger:
|
||||||
|
serializer:
|
||||||
|
default_serializer: messenger.transport.symfony_serializer
|
||||||
|
routing:
|
||||||
|
'Symfony\Bundle\FrameworkBundle\Tests\Fixtures\Messenger\DummyMessage': invalid
|
||||||
|
transports:
|
||||||
|
amqp: 'amqp://localhost/%2f/messages'
|
@ -668,8 +668,8 @@ abstract class FrameworkExtensionTest extends TestCase
|
|||||||
$this->assertTrue($container->getAlias('message_bus')->isPublic());
|
$this->assertTrue($container->getAlias('message_bus')->isPublic());
|
||||||
$this->assertTrue($container->hasAlias('messenger.default_bus'));
|
$this->assertTrue($container->hasAlias('messenger.default_bus'));
|
||||||
$this->assertTrue($container->getAlias('messenger.default_bus')->isPublic());
|
$this->assertTrue($container->getAlias('messenger.default_bus')->isPublic());
|
||||||
$this->assertFalse($container->hasDefinition('messenger.transport.amqp.factory'));
|
$this->assertTrue($container->hasDefinition('messenger.transport.amqp.factory'));
|
||||||
$this->assertFalse($container->hasDefinition('messenger.transport.redis.factory'));
|
$this->assertTrue($container->hasDefinition('messenger.transport.redis.factory'));
|
||||||
$this->assertTrue($container->hasDefinition('messenger.transport_factory'));
|
$this->assertTrue($container->hasDefinition('messenger.transport_factory'));
|
||||||
$this->assertSame(TransportFactory::class, $container->getDefinition('messenger.transport_factory')->getClass());
|
$this->assertSame(TransportFactory::class, $container->getDefinition('messenger.transport_factory')->getClass());
|
||||||
}
|
}
|
||||||
@ -712,14 +712,11 @@ abstract class FrameworkExtensionTest extends TestCase
|
|||||||
$senderLocatorDefinition = $container->getDefinition('messenger.senders_locator');
|
$senderLocatorDefinition = $container->getDefinition('messenger.senders_locator');
|
||||||
|
|
||||||
$sendersMapping = $senderLocatorDefinition->getArgument(0);
|
$sendersMapping = $senderLocatorDefinition->getArgument(0);
|
||||||
$this->assertEquals([
|
$this->assertEquals(['amqp', 'messenger.transport.audit'], $sendersMapping[DummyMessage::class]);
|
||||||
'amqp',
|
|
||||||
'audit',
|
|
||||||
], $sendersMapping[DummyMessage::class]);
|
|
||||||
$sendersLocator = $container->getDefinition((string) $senderLocatorDefinition->getArgument(1));
|
$sendersLocator = $container->getDefinition((string) $senderLocatorDefinition->getArgument(1));
|
||||||
$this->assertSame(['amqp', 'audit'], array_keys($sendersLocator->getArgument(0)));
|
$this->assertSame(['amqp', 'audit', 'messenger.transport.amqp', 'messenger.transport.audit'], array_keys($sendersLocator->getArgument(0)));
|
||||||
$this->assertEquals(new Reference('messenger.transport.amqp'), $sendersLocator->getArgument(0)['amqp']->getValues()[0]);
|
$this->assertEquals(new Reference('messenger.transport.amqp'), $sendersLocator->getArgument(0)['amqp']->getValues()[0]);
|
||||||
$this->assertEquals(new Reference('audit'), $sendersLocator->getArgument(0)['audit']->getValues()[0]);
|
$this->assertEquals(new Reference('messenger.transport.audit'), $sendersLocator->getArgument(0)['messenger.transport.audit']->getValues()[0]);
|
||||||
}
|
}
|
||||||
|
|
||||||
public function testMessengerTransportConfiguration()
|
public function testMessengerTransportConfiguration()
|
||||||
@ -776,6 +773,13 @@ abstract class FrameworkExtensionTest extends TestCase
|
|||||||
$this->createContainerFromFile('messenger_middleware_factory_erroneous_format');
|
$this->createContainerFromFile('messenger_middleware_factory_erroneous_format');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function testMessengerInvalidTransportRouting()
|
||||||
|
{
|
||||||
|
$this->expectException('LogicException');
|
||||||
|
$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.');
|
||||||
|
$this->createContainerFromFile('messenger_routing_invalid_transport');
|
||||||
|
}
|
||||||
|
|
||||||
public function testTranslator()
|
public function testTranslator()
|
||||||
{
|
{
|
||||||
$container = $this->createContainerFromFile('full');
|
$container = $this->createContainerFromFile('full');
|
||||||
|
Reference in New Issue
Block a user