Skip to content

Commit b552bb8

Browse files
committed
[Messenger][DX] Uses a default receiver when only one is defined
1 parent 0506710 commit b552bb8

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
@@ -161,26 +161,32 @@ private function guessHandledClasses(\ReflectionClass $handlerClass, string $ser
161161
private function registerReceivers(ContainerBuilder $container)
162162
{
163163
$receiverMapping = array();
164-
foreach ($container->findTaggedServiceIds($this->receiverTag) as $id => $tags) {
165-
foreach ($tags as $tag) {
166-
$receiverMapping[$id] = new Reference($id);
164+
$taggedReceivers = $container->findTaggedServiceIds($this->receiverTag);
165+
166+
foreach ($taggedReceivers as $id => $tags) {
167+
$receiverMapping[$id] = new Reference($id);
167168

169+
foreach ($tags as $tag) {
168170
if (isset($tag['name'])) {
169171
$receiverMapping[$tag['name']] = $receiverMapping[$id];
170172
}
171173
}
172174
}
173175

176+
if (1 === \count($taggedReceivers) && $container->hasDefinition('console.command.messenger_consume_messages')) {
177+
$container->getDefinition('console.command.messenger_consume_messages')->replaceArgument(3, (string) current($receiverMapping));
178+
}
179+
174180
$container->getDefinition('messenger.receiver_locator')->replaceArgument(0, $receiverMapping);
175181
}
176182

177183
private function registerSenders(ContainerBuilder $container)
178184
{
179185
$senderLocatorMapping = array();
180186
foreach ($container->findTaggedServiceIds($this->senderTag) as $id => $tags) {
181-
foreach ($tags as $tag) {
182-
$senderLocatorMapping[$id] = new Reference($id);
187+
$senderLocatorMapping[$id] = new Reference($id);
183188

189+
foreach ($tags as $tag) {
184190
if (isset($tag['name'])) {
185191
$senderLocatorMapping[$tag['name']] = $senderLocatorMapping[$id];
186192
}

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)