8000 minor #27200 [Messenger] Make sure Sender and Receiver locators have … · sroze/symfony@64a4a2b · GitHub
[go: up one dir, main page]

Skip to content

Commit 64a4a2b

Browse files
committed
minor symfony#27200 [Messenger] Make sure Sender and Receiver locators have valid services (yceruto)
This PR was squashed before being merged into the 4.1 branch (closes symfony#27200). Discussion ---------- [Messenger] Make sure Sender and Receiver locators have valid services | 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 | - This make sure that Sender and Receiver locators have valid services. Also adds minor improvements into consume command. Commits ------- 301ce5f [Messenger] Make sure Sender and Receiver locators have valid services
2 parents ae6c96e + 301ce5f commit 64a4a2b

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
@@ -173,6 +173,19 @@ public function testItRegistersSenderWithoutTagName()
173173
$this->assertEquals(array(AmqpSender::class => new Reference(AmqpSender::class)), $container->getDefinition('messenger.sender_locator')->getArgument(0));
174174
}
175175

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

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

0 commit comments

Comments
 (0)
0