Skip to content

Commit

Permalink
minor #31710 [DX][Messenger] Improve error message when routing to an…
Browse files Browse the repository at this point in the history
… invalid transport (Koc)

This PR was merged into the 4.4 branch.

Discussion
----------

[DX][Messenger] Improve error message when routing to an invalid transport

| Q             | A
| ------------- | ---
| Branch?       | 4.4
| Bug fix?      | no
| New feature?  | no
| BC breaks?    | no
| Deprecations? | no
| Tests pass?   | yes
| Fixed tickets | #31613
| License       | MIT
| Doc PR        | -

Commits
-------

7909092 [Messenger] Improve error message when routing to an invalid transport (closes #31613)
  • Loading branch information
fabpot committed Sep 28, 2019
2 parents 6fef3fb + 7909092 commit ae61ae5
Show file tree
Hide file tree
Showing 11 changed files with 89 additions and 18 deletions.
Expand Up @@ -1774,6 +1774,16 @@ private function registerMessengerConfiguration(array $config, ContainerBuilder
}
}

$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 = [];
foreach ($config['routing'] as $message => $messageConfiguration) {
if ('*' !== $message && !class_exists($message) && !interface_exists($message, false)) {
Expand All @@ -1782,19 +1792,14 @@ private function registerMessengerConfiguration(array $config, ContainerBuilder

// make sure senderAliases contains all senders
foreach ($messageConfiguration['senders'] as $sender) {
if (!isset($senderAliases[$sender])) {
$senderAliases[$sender] = $sender;
if (!isset($senderReferences[$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'];
}

$senderReferences = [];
foreach ($senderAliases as $alias => $serviceId) {
$senderReferences[$alias] = new Reference($serviceId);
}

$container->getDefinition('messenger.senders_locator')
->replaceArgument(0, $messageToSendersMapping)
->replaceArgument(1, ServiceLocatorTagPass::register($container, $senderReferences))
Expand Down
Expand Up @@ -9,5 +9,10 @@
FooMessage::class => ['sender.bar', 'sender.biz'],
BarMessage::class => 'sender.foo',
],
'transports' => [
'sender.biz' => 'null://',
'sender.bar' => 'null://',
'sender.foo' => 'null://',
],
],
]);
Expand Up @@ -7,14 +7,15 @@
'default_serializer' => 'messenger.transport.symfony_serializer',
],
'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' => [
'senders' => ['amqp', 'audit'],
],
'*' => 'amqp',
],
'transports' => [
'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',
],
],
]);
Expand Up @@ -14,6 +14,9 @@
<framework:routing message-class="Symfony\Bundle\FrameworkBundle\Tests\Fixtures\Messenger\BarMessage">
<framework:sender service="sender.foo" />
</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:config>
</container>
Expand Up @@ -11,7 +11,7 @@
<framework:serializer default-serializer="messenger.transport.symfony_serializer" />
<framework:routing message-class="Symfony\Bundle\FrameworkBundle\Tests\Fixtures\Messenger\DummyMessage">
<framework:sender service="amqp" />
<framework:sender service="audit" />
<framework:sender service="messenger.transport.audit" />
</framework:routing>
<framework:routing message-class="Symfony\Bundle\FrameworkBundle\Tests\Fixtures\Messenger\SecondMessage">
<framework:sender service="amqp" />
Expand All @@ -21,6 +21,7 @@
<framework:sender service="amqp" />
</framework:routing>
<framework:transport name="amqp" dsn="amqp://localhost/%2f/messages" />
<framework:transport name="audit" dsn="null://" />
</framework:messenger>
</framework:config>
</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>
Expand Up @@ -3,3 +3,7 @@ framework:
routing:
'Symfony\Bundle\FrameworkBundle\Tests\Fixtures\Messenger\FooMessage': ['sender.bar', 'sender.biz']
'Symfony\Bundle\FrameworkBundle\Tests\Fixtures\Messenger\BarMessage': 'sender.foo'
transports:
sender.biz: 'null://'
sender.bar: 'null://'
sender.foo: 'null://'
Expand Up @@ -4,9 +4,10 @@ framework:
serializer:
default_serializer: messenger.transport.symfony_serializer
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':
senders: [amqp, audit]
'*': amqp
transports:
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'
Expand Up @@ -668,8 +668,8 @@ public function testMessenger()
$this->assertTrue($container->getAlias('message_bus')->isPublic());
$this->assertTrue($container->hasAlias('messenger.default_bus'));
$this->assertTrue($container->getAlias('messenger.default_bus')->isPublic());
$this->assertFalse($container->hasDefinition('messenger.transport.amqp.factory'));
$this->assertFalse($container->hasDefinition('messenger.transport.redis.factory'));
$this->assertTrue($container->hasDefinition('messenger.transport.amqp.factory'));
$this->assertTrue($container->hasDefinition('messenger.transport.redis.factory'));
$this->assertTrue($container->hasDefinition('messenger.transport_factory'));
$this->assertSame(TransportFactory::class, $container->getDefinition('messenger.transport_factory')->getClass());
}
Expand Down Expand Up @@ -712,14 +712,11 @@ public function testMessengerRouting()
$senderLocatorDefinition = $container->getDefinition('messenger.senders_locator');

$sendersMapping = $senderLocatorDefinition->getArgument(0);
$this->assertEquals([
'amqp',
'audit',
], $sendersMapping[DummyMessage::class]);
$this->assertEquals(['amqp', 'messenger.transport.audit'], $sendersMapping[DummyMessage::class]);
$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('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()
Expand Down Expand Up @@ -776,6 +773,13 @@ public function testMessengerMiddlewareFactoryErroneousFormat()
$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()
{
$container = $this->createContainerFromFile('full');
Expand Down

0 comments on commit ae61ae5

Please sign in to comment.