Skip to content

Commit

Permalink
minor #26909 [Messenger][DX] Uses the adapter name instead of the ser…
Browse files Browse the repository at this point in the history
…vice name (sroze)

This PR was squashed before being merged into the 4.1-dev branch (closes #26909).

Discussion
----------

[Messenger][DX] Uses the adapter name instead of the service name

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

As a developer, I don't get why I would need to use the service name while I give a name to the adapters. This is basically what this PR means for me in terms of configuration:
```patch
framework:
    messenger:
        routing:
            # We want the command below to be handled async with the "messenger.default_sender" (AMQP producer).
-            'App\Message\Command\CreateNumber': messenger.sender.amqp
+            'App\Message\Command\CreateNumber': amqp

        adapters:
            amqp: "%env(AMQP_DSN)%"
```

And in terms of pulling the messages:
```patch
- bin/console messenger:consume-messages messenger.receiver.amqp
+ bin/console messenger:consume-messages amqp
```

Commits
-------

b5afb40 [Messenger][DX] Uses the adapter name instead of the service name
  • Loading branch information
fabpot committed Apr 16, 2018
2 parents c442929 + b5afb40 commit 7e4de96
Show file tree
Hide file tree
Showing 4 changed files with 53 additions and 15 deletions.
Expand Up @@ -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']) {
Expand All @@ -1476,15 +1468,15 @@ 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'),
'createReceiver',
))->setArguments(array(
$adapter['dsn'],
$adapter['options'],
))->addTag('messenger.receiver'));
))->addTag('messenger.receiver', array('name' => $name)));
}
}

Expand Down
Expand Up @@ -545,26 +545,28 @@ 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();
$senderArguments = $container->getDefinition('messenger.sender.customised')->getArguments();

$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();
$receiverArguments = $container->getDefinition('messenger.receiver.customised')->getArguments();

$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()
Expand Down
Expand Up @@ -60,6 +60,7 @@ public function process(ContainerBuilder $container)
}

$this->registerReceivers($container);
$this->registerSenders($container);
$this->registerHandlers($container);
}

Expand Down Expand Up @@ -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);
}
}
Expand Up @@ -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;
Expand Down Expand Up @@ -90,6 +92,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.
Expand Down Expand Up @@ -201,6 +223,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'))
Expand Down

0 comments on commit 7e4de96

Please sign in to comment.