10000 [Messenger] Make sure Sender and Receiver locators have valid services · sroze/symfony@301ce5f · GitHub
[go: up one dir, main page]

Skip to content

Commit 301ce5f

Browse files
ycerutosroze
authored andcommitted
[Messenger] Make sure Sender and Receiver locators have valid services
1 parent 1403112 commit 301ce5f

File tree

3 files changed

+38
-7
lines changed

3 files changed

+38
-7
lines changed

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

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
use Psr\Container\ContainerInterface;
1515
use Psr\Log\LoggerInterface;
1616
use Symfony\Component\Console\Command\Command;
17+
use Symfony\Component\Console\Exception\RuntimeException;
1718
use Symfony\Component\Console\Input\InputArgument;
1819
use Symfony\Component\Console\Input\InputInterface;
1920
use Symfony\Component\Console\Input\InputOption;
@@ -22,7 +23,6 @@
2223
use Symfony\Component\Messenger\Transport\Enhancers\StopWhenMemoryUsageIsExceededReceiver;
2324
use Symfony\Component\Messenger\Transport\Enhancers\StopWhenMessageCountIsExceededReceiver;
2425
use Symfony\Component\Messenger\Transport\Enhancers\StopWhenTimeLimitIsReachedReceiver;
25-
use Symfony\Component\Messenger\Transport\ReceiverInterface;
2626
use Symfony\Component\Messenger\Worker;
2727

2828
/**
@@ -89,12 +89,10 @@ protected function configure(): void
8989
protected function execute(InputInterface $input, OutputInterface $output): void
9090
{
9191
if (!$this->receiverLocator->has($receiverName = $input->getArgument('receiver'))) {
92-
throw new \RuntimeException(sprintf('Receiver "%s" does not exist.', $receiverName));
92+
throw new RuntimeException(sprintf('Receiver "%s" does not exist.', $receiverName));
9393
}
9494

95-
if (!($receiver = $this->receiverLocator->get($receiverName)) instanceof ReceiverInterface) {
96-
throw new \RuntimeException(sprintf('Receiver "%s" is not a valid message consumer. It must implement the "%s" interface.', $receiverName, ReceiverInterface::class));
97-
}
95+
$receiver = $this->receiverLocator->get($receiverName);
9896

9997
if ($limit = $input->getOption('limit')) {
10098
$receiver = new StopWhenMessageCountIsExceededReceiver($receiver, $limit, $this->logger);
@@ -117,9 +115,9 @@ private function convertToBytes(string $memoryLimit): int
117115
$memoryLimit = strtolower($memoryLimit);
118116
$max = strtolower(ltrim($memoryLimit, '+'));
119117
if (0 === strpos($max, '0x')) {
120-
$max = intval($max, 16);
118+
$max = \intval($max, 16);
121119
} elseif (0 === strpos($max, '0')) {
122-
$max = intval($max, 8);
120+
$max = \intval($max, 8);
123121
} else {
124122
$max = (int) $max;
125123
}

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

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,8 @@
2323
use Symfony\Component\Messenger\Handler\MessageHandlerInterface;
2424
use Symfony\Component\Messenger\Handler\MessageSubscriberInterface;
2525
use Symfony\Component\Messenger\TraceableMessageBus;
26+
use Symfony\Component\Messenger\Transport\ReceiverInterface;
27+
use Symfony\Component\Messenger\Transport\SenderInterface;
2628

2729
/**
2830
* @author Samuel Roze <samuel.roze@gmail.com>
@@ -167,6 +169,11 @@ private function registerReceivers(ContainerBuilder $container)
167169
$taggedReceivers = $container->findTaggedServiceIds($this->receiverTag);
168170

169171
foreach ($taggedReceivers as $id => $tags) {
172+
$receiverClass = $container->findDefinition($id)->getClass();
173+
if (!is_subclass_of($receiverClass, ReceiverInterface::class)) {
174+
throw new RuntimeException(sprintf('Invalid receiver "%s": class "%s" must implement interface "%s".', $id, $receiverClass, ReceiverInterface::class));
175+
}
176+
170177
$receiverMapping[$id] = new Reference($id);
171178

172179
foreach ($tags as $tag) {
@@ -187,6 +194,11 @@ private function registerSenders(ContainerBuilder $container)
187194
{
188195
$senderLocatorMapping = array();
189196
foreach ($container->findTaggedServiceIds($this->senderTag) as $id => $tags) {
197+
$senderClass = $container->findDefinition($id)->getClass();
198+
if (!is_subclass_of($senderClass, SenderInterface::class)) {
199+
throw new RuntimeException(sprintf('Invalid sender "%s": class "%s" must implement interface "%s".', $id, $senderClass, SenderInterface::class));
200+
}
201+
190202
$senderLocatorMapping[$id] = new Reference($id);
191203

192204
foreach ($tags as $tag) {

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

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -172,6 +172,19 @@ public function testItRegistersSenderWithoutTagName()
172172
$this->assertEquals(array(AmqpSender::class => new Reference(AmqpSender::class)), $container->getDefinition('messenger.sender_locator')->getArgument(0));
173173
}
174174

175+
/**
176+
* @expectedException \Symfony\Component\DependencyInjection\Exception\RuntimeException
177+
* @expectedExceptionMessage Invalid sender "app.messenger.sender": class "Symfony\Component\Messenger\Tests\DependencyInjection\InvalidSender" must implement interface "Symfony\Component\Messenger\Transport\SenderInterface".
178+
*/
179+
public function testItDoesNotRegisterInvalidSender()
180+
{
181+
$container = $this->getContainerBuilder();
182+
$container->register('app.messenger.sender', InvalidSender::class)
183+
->addTag('messenger.sender');
184+
185+
(new MessengerPass())->process($container);
186+
}
187+
175188
/**
176189
* @expectedException \Symfony\Component\DependencyInjection\Exception\RuntimeException
177190
* @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.
@@ -366,6 +379,14 @@ public function stop(): void
366379
}
367380
}
368381

382+
class InvalidReceiver
383+
{
384+
}
385+
386+
class InvalidSender
387+
{
388+
}
389+
369390
class UndefinedMessageHandler
370391
{
371392
public function __invoke(UndefinedMessage $message)

0 commit comments

Comments
 (0)
0