Skip to content

Commit 4a25ddc

Browse files
committed
Uses a default receiver when only one is defined
1 parent b931902 commit 4a25ddc

File tree

3 files changed

+58
-10
lines changed

3 files changed

+58
-10
lines changed

src/Symfony/Component/Messenger/Command/ConsumeMessagesCommand.php

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ protected function configure(): void
5454
{
5555
$this
5656
->setDefinition(array(
57-
new InputArgument('receiver', InputArgument::REQUIRED, 'Name of the receiver'),
57+
new InputArgument('receiver', InputArgument::OPTIONAL, 'Name of the receiver'),
5858
new InputOption('limit', 'l', InputOption::VALUE_REQUIRED, 'Limit the number of received messages'),
5959
new InputOption('memory-limit', 'm', InputOption::VALUE_REQUIRED, 'The memory limit the worker can consume'),
6060
new InputOption('time-limit', 't', InputOption::VALUE_REQUIRED, 'The time limit in seconds the worker can run'),
@@ -86,7 +86,17 @@ protected function configure(): void
8686
*/
8787
protected function execute(InputInterface $input, OutputInterface $output): void
8888
{
89-
if (!$this->receiverLocator->has($receiverName = $input->getArgument('receiver'))) {
89+
$receiverName = $input->getArgument('receiver');
90+
91+
if (empty($receiverName)) {
92+
$receiverName = '.default';
93+
94+
if (!$this->receiverLocator->has($receiverName)) {
95+
throw new \RuntimeException('You have 0 or more than one receiver (no default have been found). You need to specify the receiver name with an argument.');
96+
}
97+
}
98+
99+
if (!$this->receiverLocator->has($receiverName)) {
90100
throw new \RuntimeException(sprintf('Receiver "%s" does not exist.', $receiverName));
91101
}
92102

src/Symfony/Component/Messenger/DependencyInjection/MessengerPass.php

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -161,7 +161,9 @@ 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) {
164+
$taggedServices = $container->findTaggedServiceIds($this->receiverTag);
165+
166+
foreach ($taggedServices as $id => $tags) {
165167
foreach ($tags as $tag) {
166168
$receiverMapping[$id] = new Reference($id);
167169

@@ -171,6 +173,10 @@ private function registerReceivers(ContainerBuilder $container)
171173
}
172174
}
173175

176+
if (1 === \count($taggedServices)) {
177+
$receiverMapping['.default'] = current($receiverMapping);
178+
}
179+
174180
$container->getDefinition('messenger.receiver_locator')->replaceArgument(0, $receiverMapping);
175181
}
176182

src/Symfony/Component/Messenger/Tests/DependencyInjection/MessengerPassTest.php

Lines changed: 39 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -62,10 +62,9 @@ public function testProcess()
6262
$handlerLocatorDefinition->getArgument(0)
6363
);
6464

65-
$this->assertEquals(
66-
array(DummyReceiver::class => new Reference(DummyReceiver::class)),
67-
$container->getDefinition('messenger.receiver_locator')->getArgument(0)
68-
);
65+
$receiverMapping = $container->getDefinition('messenger.receiver_locator')->getArgument(0);
66+
$this->assertArrayHasKey(DummyReceiver::class, $receiverMapping);
67+
$this->assertEquals(new Reference(DummyReceiver::class), $receiverMapping[DummyReceiver::class]);
6968
}
7069

7170
public function testGetClassesFromTheHandlerSubscriberInterface()
@@ -96,14 +95,34 @@ public function testGetClassesFromTheHandlerSubscriberInterface()
9695
$this->assertEquals(array(new Reference(PrioritizedHandler::class), new Reference(HandlerWithMultipleMessages::class)), $definition->getArgument(0));
9796
}
9897

99-
public function testItRegistersReceivers()
98+
public function testItRegistersAReceiverWithTheDefaultKey()
99+
{
100+
$container = $this->getContainerBuilder();
101+
$container->register(AmqpReceiver::class, AmqpReceiver::class)->addTag('messenger.receiver', array('name' => 'amqp'));
102+
103+
(new MessengerPass())->process($container);
104+
105+
$this->assertEquals(array(
106+
'amqp' => $amqpReference = new Reference(AmqpReceiver::class),
107+
AmqpReceiver::class => $amqpReference,
108+
'.default' => $amqpReference,
109+
), $container->getDefinition('messenger.receiver_locator')->getArgument(0));
110+
}
111+
112+
public function testItRegistersMultipleReceivers()
100113
{
101114
$container = $this->getContainerBuilder();
102115
$container->register(AmqpReceiver::class, AmqpReceiver::class)->addTag('messenger.receiver', array('name' => 'amqp'));
116+
$container->register(DummyReceiver::class, DummyReceiver::class)->addTag('messenger.receiver', array('name' => 'dummy'));
103117

104118
(new MessengerPass())->process($container);
105119

106-
$this->assertEquals(array('amqp' => new Reference(AmqpReceiver::class), AmqpReceiver::class => new Reference(AmqpReceiver::class)), $container->getDefinition('messenger.receiver_locator')->getArgument(0));
120+
$this->assertEquals(array(
121+
'amqp' => $amqpReference = new Reference(AmqpReceiver::class),
122+
AmqpReceiver::class => $amqpReference,
123+
'dummy' => $dummyReference = new Reference(DummyReceiver::class),
124+
DummyReceiver::class => $dummyReference,
125+
), $container->getDefinition('messenger.receiver_locator')->getArgument(0));
107126
}
108127

109128
public function testItRegistersReceiversWithoutTagName()
@@ -113,7 +132,9 @@ public function testItRegistersReceiversWithoutTagName()
113132

114133
(new MessengerPass())->process($container);
115134

116-
$this->assertEquals(array(AmqpReceiver::class => new Reference(AmqpReceiver::class)), $container->getDefinition('messenger.receiver_locator')->getArgument(0));
135+
$receiverMapping = $container->getDefinition('messenger.receiver_locator')->getArgument(0);
136+
$this->assertArrayHasKey(AmqpReceiver::class, $receiverMapping);
137+
$this->assertEquals(new Reference(AmqpReceiver::class), $receiverMapping[AmqpReceiver::class]);
117138
}
118139

119140
public function testItRegistersSenders()
@@ -410,3 +431,14 @@ public function handle($message, callable $next)
410431
return $next($message);
411432
}
412433
}
434+
435+
class NullReceiver implements ReceiverInterface
436+
{
437+
public function receive(callable $handler): void
438+
{
439+
}
440+
441+
public function stop(): void
442+
{
443+
}
444+
}

0 commit comments

Comments
 (0)