From b5afb4044131f6c86524565152e1a39a5cfdce6d Mon Sep 17 00:00:00 2001 From: Samuel ROZE Date: Thu, 12 Apr 2018 20:17:47 +0100 Subject: [PATCH] [Messenger][DX] Uses the adapter name instead of the service name --- .../FrameworkExtension.php | 12 ++------- .../FrameworkExtensionTest.php | 10 ++++--- .../DependencyInjection/MessengerPass.php | 19 ++++++++++++- .../DependencyInjection/MessengerPassTest.php | 27 +++++++++++++++++++ 4 files changed, 53 insertions(+), 15 deletions(-) diff --git a/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/FrameworkExtension.php b/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/FrameworkExtension.php index 51aee716f43f..aaa548b18488 100644 --- a/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/FrameworkExtension.php +++ b/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/FrameworkExtension.php @@ -1446,19 +1446,11 @@ private function registerMessengerConfiguration(array $config, ContainerBuilder $loader->load('messenger.xml'); - $senderLocatorMapping = array(); $messageToSenderIdsMapping = array(); foreach ($config['routing'] as $message => $messageConfiguration) { - foreach ($messageConfiguration['senders'] as $sender) { - if (null !== $sender) { - $senderLocatorMapping[$sender] = new Reference($sender); - } - } - $messageToSenderIdsMapping[$message] = $messageConfiguration['senders']; } - $container->getDefinition('messenger.sender_locator')->replaceArgument(0, $senderLocatorMapping); $container->getDefinition('messenger.asynchronous.routing.sender_locator')->replaceArgument(1, $messageToSenderIdsMapping); if ($config['middlewares']['validation']['enabled']) { @@ -1476,7 +1468,7 @@ private function registerMessengerConfiguration(array $config, ContainerBuilder ))->setArguments(array( $adapter['dsn'], $adapter['options'], - ))->addTag('messenger.sender')); + ))->addTag('messenger.sender', array('name' => $name))); $container->setDefinition('messenger.receiver.'.$name, (new Definition(ReceiverInterface::class))->setFactory(array( new Reference('messenger.adapter_factory'), @@ -1484,7 +1476,7 @@ private function registerMessengerConfiguration(array $config, ContainerBuilder ))->setArguments(array( $adapter['dsn'], $adapter['options'], - ))->addTag('messenger.receiver')); + ))->addTag('messenger.receiver', array('name' => $name))); } } diff --git a/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/FrameworkExtensionTest.php b/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/FrameworkExtensionTest.php index 87824e829352..db4809eab02a 100644 --- a/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/FrameworkExtensionTest.php +++ b/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/FrameworkExtensionTest.php @@ -544,8 +544,10 @@ public function testMessengerAdapter() $container = $this->createContainerFromFile('messenger_adapter'); $this->assertTrue($container->hasDefinition('messenger.sender.default')); $this->assertTrue($container->getDefinition('messenger.sender.default')->hasTag('messenger.sender')); + $this->assertEquals(array(array('name' => 'default')), $container->getDefinition('messenger.sender.default')->getTag('messenger.sender')); $this->assertTrue($container->hasDefinition('messenger.receiver.default')); $this->assertTrue($container->getDefinition('messenger.receiver.default')->hasTag('messenger.receiver')); + $this->assertEquals(array(array('name' => 'default')), $container->getDefinition('messenger.receiver.default')->getTag('messenger.receiver')); $this->assertTrue($container->hasDefinition('messenger.sender.customised')); $senderFactory = $container->getDefinition('messenger.sender.customised')->getFactory(); @@ -553,8 +555,8 @@ public function testMessengerAdapter() $this->assertEquals(array(new Reference('messenger.adapter_factory'), 'createSender'), $senderFactory); $this->assertCount(2, $senderArguments); - $this->assertEquals('amqp://localhost/%2f/messages?exchange_name=exchange_name', $senderArguments[0]); - $this->assertEquals(array('queue_name' => 'Queue'), $senderArguments[1]); + $this->assertSame('amqp://localhost/%2f/messages?exchange_name=exchange_name', $senderArguments[0]); + $this->assertSame(array('queue_name' => 'Queue'), $senderArguments[1]); $this->assertTrue($container->hasDefinition('messenger.receiver.customised')); $receiverFactory = $container->getDefinition('messenger.receiver.customised')->getFactory(); @@ -562,8 +564,8 @@ public function testMessengerAdapter() $this->assertEquals(array(new Reference('messenger.adapter_factory'), 'createReceiver'), $receiverFactory); $this->assertCount(2, $receiverArguments); - $this->assertEquals('amqp://localhost/%2f/messages?exchange_name=exchange_name', $receiverArguments[0]); - $this->assertEquals(array('queue_name' => 'Queue'), $receiverArguments[1]); + $this->assertSame('amqp://localhost/%2f/messages?exchange_name=exchange_name', $receiverArguments[0]); + $this->assertSame(array('queue_name' => 'Queue'), $receiverArguments[1]); } public function testTranslator() diff --git a/src/Symfony/Component/Messenger/DependencyInjection/MessengerPass.php b/src/Symfony/Component/Messenger/DependencyInjection/MessengerPass.php index e6c18ad875d4..120ccee42b98 100644 --- a/src/Symfony/Component/Messenger/DependencyInjection/MessengerPass.php +++ b/src/Symfony/Component/Messenger/DependencyInjection/MessengerPass.php @@ -60,6 +60,7 @@ public function process(ContainerBuilder $container) } $this->registerReceivers($container); + $this->registerSenders($container); $this->registerHandlers($container); } @@ -156,10 +157,26 @@ private function registerReceivers(ContainerBuilder $container) $receiverMapping = array(); foreach ($container->findTaggedServiceIds('messenger.receiver') as $id => $tags) { foreach ($tags as $tag) { - $receiverMapping[$tag['id'] ?? $id] = new Reference($id); + $receiverMapping[$tag['name'] ?? $id] = new Reference($id); } } $container->getDefinition('messenger.receiver_locator')->replaceArgument(0, $receiverMapping); } + + private function registerSenders(ContainerBuilder $container) + { + $senderLocatorMapping = array(); + foreach ($container->findTaggedServiceIds('messenger.sender') as $id => $tags) { + foreach ($tags as $tag) { + $senderLocatorMapping[$id] = new Reference($id); + + if ($tag['name']) { + $senderLocatorMapping[$tag['name']] = new Reference($id); + } + } + } + + $container->getDefinition('messenger.sender_locator')->replaceArgument(0, $senderLocatorMapping); + } } diff --git a/src/Symfony/Component/Messenger/Tests/DependencyInjection/MessengerPassTest.php b/src/Symfony/Component/Messenger/Tests/DependencyInjection/MessengerPassTest.php index b9e73ecd3d70..0c7395cf3f64 100644 --- a/src/Symfony/Component/Messenger/Tests/DependencyInjection/MessengerPassTest.php +++ b/src/Symfony/Component/Messenger/Tests/DependencyInjection/MessengerPassTest.php @@ -16,6 +16,8 @@ use Symfony\Component\DependencyInjection\ContainerBuilder; use Symfony\Component\DependencyInjection\Reference; use Symfony\Component\DependencyInjection\ServiceLocator; +use Symfony\Component\Messenger\Adapter\AmqpExt\AmqpReceiver; +use Symfony\Component\Messenger\Adapter\AmqpExt\AmqpSender; use Symfony\Component\Messenger\ContainerHandlerLocator; use Symfony\Component\Messenger\DependencyInjection\MessengerPass; use Symfony\Component\Messenger\Handler\ChainHandler; @@ -88,6 +90,26 @@ public function testGetClassesFromTheHandlerSubscriberInterface() $this->assertEquals(array(new Reference(PrioritizedHandler::class), new Reference(HandlerWithMultipleMessages::class)), $definition->getArgument(0)); } + public function testItRegistersReceivers() + { + $container = $this->getContainerBuilder(); + $container->register(AmqpReceiver::class, AmqpReceiver::class)->addTag('messenger.receiver', array('name' => 'amqp')); + + (new MessengerPass())->process($container); + + $this->assertEquals(array('amqp' => new Reference(AmqpReceiver::class)), $container->getDefinition('messenger.receiver_locator')->getArgument(0)); + } + + public function testItRegistersSenders() + { + $container = $this->getContainerBuilder(); + $container->register(AmqpSender::class, AmqpSender::class)->addTag('messenger.sender', array('name' => 'amqp')); + + (new MessengerPass())->process($container); + + $this->assertEquals(array('amqp' => new Reference(AmqpSender::class), AmqpSender::class => new Reference(AmqpSender::class)), $container->getDefinition('messenger.sender_locator')->getArgument(0)); + } + /** * @expectedException \Symfony\Component\DependencyInjection\Exception\RuntimeException * @expectedExceptionMessage Invalid handler service "Symfony\Component\Messenger\Tests\DependencyInjection\UndefinedMessageHandler": message class "Symfony\Component\Messenger\Tests\DependencyInjection\UndefinedMessage" used as argument type in method "Symfony\Component\Messenger\Tests\DependencyInjection\UndefinedMessageHandler::__invoke()" does not exist. @@ -199,6 +221,11 @@ private function getContainerBuilder(): ContainerBuilder $container->setParameter('kernel.debug', true); $container->register('message_bus', ContainerHandlerLocator::class); + $container + ->register('messenger.sender_locator', ServiceLocator::class) + ->addArgument(new Reference('service_container')) + ; + $container ->register('messenger.handler_resolver', ContainerHandlerLocator::class) ->addArgument(new Reference('service_container'))