Skip to content

Commit 42ae740

Browse files
committed
minor #27203 [Messenger][DX] Uses a default receiver when only one is defined (sroze)
This PR was squashed before being merged into the 4.1 branch (closes #27203). Discussion ---------- [Messenger][DX] Uses a default receiver when only one is defined | Q | A | ------------- | --- | Branch? | 4.1 | Bug fix? | no | New feature? | no | BC breaks? | no | Deprecations? | no | Tests pass? | yes | Fixed tickets | ø | License | MIT | Doc PR | ø When using only one receiver, as a developer, it makes no sense for me to have to precise the receiver name when using the `messenger:consume-messages` command. This is the change: ```patch - bin/console messenger:consume-messages default + bin/console messenger:consume-messages ``` If I have more than one transport configured, I'll get the following message: > > You have 0 or more than one receiver (no default have been found). You need to specify the receiver name with an argument. > Commits ------- 8315b868d5 [Messenger][DX] Uses a default receiver when only one is defined
2 parents 9f697c0 + b552bb8 commit 42ae740

File tree

3 files changed

+51
-7
lines changed

3 files changed

+51
-7
lines changed

Command/ConsumeMessagesCommand.php

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,14 +37,16 @@ class ConsumeMessagesCommand extends Command
3737
private $bus;
3838
private $receiverLocator;
3939
private $logger;
40+
private $defaultReceiverName;
4041

41-
public function __construct(MessageBusInterface $bus, ContainerInterface $receiverLocator, LoggerInterface $logger = null)
42+
public function __construct(MessageBusInterface $bus, ContainerInterface $receiverLocator, LoggerInterface $logger = null, string $defaultReceiverName = null)
4243
{
4344
parent::__construct();
4445

4546
$this->bus = $bus;
4647
$this->receiverLocator = $receiverLocator;
4748
$this->logger = $logger;
49+
$this->defaultReceiverName = $defaultReceiverName;
4850
}
4951

5052
/**
@@ -54,7 +56,7 @@ protected function configure(): void
5456
{
5557
$this
5658
->setDefinition(array(
57-
new InputArgument('receiver', InputArgument::REQUIRED, 'Name of the receiver'),
59+
new InputArgument('receiver', $this->defaultReceiverName ? InputArgument::OPTIONAL : InputArgument::REQUIRED, 'Name of the receiver', $this->defaultReceiverName),
5860
new InputOption('limit', 'l', InputOption::VALUE_REQUIRED, 'Limit the number of received messages'),
5961
new InputOption('memory-limit', 'm', InputOption::VALUE_REQUIRED, 'The memory limit the worker can consume'),
6062
new InputOption('time-limit', 't', InputOption::VALUE_REQUIRED, 'The time limit in seconds the worker can run'),

DependencyInjection/MessengerPass.php

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -164,26 +164,32 @@ private function guessHandledClasses(\ReflectionClass $handlerClass, string $ser
164164
private function registerReceivers(ContainerBuilder $container)
165165
{
166166
$receiverMapping = array();
167-
foreach ($container->findTaggedServiceIds($this->receiverTag) as $id => $tags) {
168-
foreach ($tags as $tag) {
169-
$receiverMapping[$id] = new Reference($id);
167+
$taggedReceivers = $container->findTaggedServiceIds($this->receiverTag);
168+
169+
foreach ($taggedReceivers as $id => $tags) {
170+
$receiverMapping[$id] = new Reference($id);
170171

172+
foreach ($tags as $tag) {
171173
if (isset($tag['name'])) {
172174
$receiverMapping[$tag['name']] = $receiverMapping[$id];
173175
}
174176
}
175177
}
176178

179+
if (1 === \count($taggedReceivers) && $container->hasDefinition('console.command.messenger_consume_messages')) {
180+
$container->getDefinition('console.command.messenger_consume_messages')->replaceArgument(3, (string) current($receiverMapping));
181+
}
182+
177183
$container->getDefinition('messenger.receiver_locator')->replaceArgument(0, $receiverMapping);
178184
}
179185

180186
private function registerSenders(ContainerBuilder $container)
181187
{
182188
$senderLocatorMapping = array();
183189
foreach ($container->findTaggedServiceIds($this->senderTag) as $id => $tags) {
184-
foreach ($tags as $tag) {
185-
$senderLocatorMapping[$id] = new Reference($id);
190+
$senderLocatorMapping[$id] = new Reference($id);
186191

192+
foreach ($tags as $tag) {
187193
if (isset($tag['name'])) {
188194
$senderLocatorMapping[$tag['name']] = $senderLocatorMapping[$id];
189195
}

Tests/DependencyInjection/MessengerPassTest.php

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
use Symfony\Component\DependencyInjection\ContainerBuilder;
1717
use Symfony\Component\DependencyInjection\Reference;
1818
use Symfony\Component\DependencyInjection\ServiceLocator;
19+
use Symfony\Component\Messenger\Command\ConsumeMessagesCommand;
1920
use Symfony\Component\Messenger\Transport\AmqpExt\AmqpReceiver;
2021
use Symfony\Component\Messenger\Transport\AmqpExt\AmqpSender;
2122
use Symfony\Component\Messenger\Handler\Locator\ContainerHandlerLocator;
@@ -116,6 +117,41 @@ public function testItRegistersReceiversWithoutTagName()
116117
$this->assertEquals(array(AmqpReceiver::class => new Reference(AmqpReceiver::class)), $container->getDefinition('messenger.receiver_locator')->getArgument(0));
117118
}
118119

120+
public function testItRegistersOneReceiverAndSetsTheDefaultOneOnTheCommand()
121+
{
122+
$container = $this->getContainerBuilder();
123+
$container->register('console.command.messenger_consume_messages', ConsumeMessagesCommand::class)->setArguments(array(
124+
new Reference('message_bus'),
125+
new Reference('messenger.receiver_locator'),
126+
null,
127+
null,
128+
));
129+
130+
$container->register(AmqpReceiver::class, AmqpReceiver::class)->addTag('messenger.receiver', array('name' => 'amqp'));
131+
132+
(new MessengerPass())->process($container);
133+
134+
$this->assertSame(AmqpReceiver::class, $container->getDefinition('console.command.messenger_consume_messages')->getArgument(3));
135+
}
136+
137+
public function testItRegistersMultipleReceiversAndDoesNotSetTheDefaultOneOnTheCommand()
138+
{
139+
$container = $this->getContainerBuilder();
140+
$container->register('console.command.messenger_consume_messages', ConsumeMessagesCommand::class)->setArguments(array(
141+
new Reference('message_bus'),
142+
new Reference('messenger.receiver_locator'),
143+
null,
144+
null,
145+
));
146+
147+
$container->register(AmqpReceiver::class, AmqpReceiver::class)->addTag('messenger.receiver', array('name' => 'amqp'));
148+
$container->register(DummyReceiver::class, DummyReceiver::class)->addTag('messenger.receiver', array('name' => 'dummy'));
149+
150+
(new MessengerPass())->process($container);
151+
152+
$this->assertNull($container->getDefinition('console.command.messenger_consume_messages')->getArgument(3));
153+
}
154+
119155
public function testItRegistersSenders()
120156
{
121157
$container = $this->getContainerBuilder();

0 commit comments

Comments
 (0)