diff --git a/src/Symfony/Bundle/FrameworkBundle/Resources/config/console.php b/src/Symfony/Bundle/FrameworkBundle/Resources/config/console.php index 9bc03cc204858..610a83addec42 100644 --- a/src/Symfony/Bundle/FrameworkBundle/Resources/config/console.php +++ b/src/Symfony/Bundle/FrameworkBundle/Resources/config/console.php @@ -151,6 +151,7 @@ service('logger')->nullOnInvalid(), [], // Receiver names service('messenger.listener.reset_services')->nullOnInvalid(), + [], // Bus names ]) ->tag('console.command') ->tag('monolog.logger', ['channel' => 'messenger']) diff --git a/src/Symfony/Component/Messenger/Command/ConsumeMessagesCommand.php b/src/Symfony/Component/Messenger/Command/ConsumeMessagesCommand.php index 29e65474055d7..e490116443795 100644 --- a/src/Symfony/Component/Messenger/Command/ConsumeMessagesCommand.php +++ b/src/Symfony/Component/Messenger/Command/ConsumeMessagesCommand.php @@ -14,6 +14,8 @@ use Psr\Container\ContainerInterface; use Psr\Log\LoggerInterface; use Symfony\Component\Console\Command\Command; +use Symfony\Component\Console\Completion\CompletionInput; +use Symfony\Component\Console\Completion\CompletionSuggestions; use Symfony\Component\Console\Exception\RuntimeException; use Symfony\Component\Console\Input\InputArgument; use Symfony\Component\Console\Input\InputInterface; @@ -45,8 +47,9 @@ class ConsumeMessagesCommand extends Command private $logger; private $receiverNames; private $resetServicesListener; + private $busIds; - public function __construct(RoutableMessageBus $routableBus, ContainerInterface $receiverLocator, EventDispatcherInterface $eventDispatcher, LoggerInterface $logger = null, array $receiverNames = [], ResetServicesListener $resetServicesListener = null) + public function __construct(RoutableMessageBus $routableBus, ContainerInterface $receiverLocator, EventDispatcherInterface $eventDispatcher, LoggerInterface $logger = null, array $receiverNames = [], ResetServicesListener $resetServicesListener = null, array $busIds = []) { $this->routableBus = $routableBus; $this->receiverLocator = $receiverLocator; @@ -54,6 +57,7 @@ public function __construct(RoutableMessageBus $routableBus, ContainerInterface $this->logger = $logger; $this->receiverNames = $receiverNames; $this->resetServicesListener = $resetServicesListener; + $this->busIds = $busIds; parent::__construct(); } @@ -223,6 +227,19 @@ protected function execute(InputInterface $input, OutputInterface $output) return 0; } + public function complete(CompletionInput $input, CompletionSuggestions $suggestions): void + { + if ($input->mustSuggestArgumentValuesFor('receivers')) { + $suggestions->suggestValues(array_diff($this->receiverNames, array_diff($input->getArgument('receivers'), [$input->getCompletionValue()]))); + + return; + } + + if ($input->mustSuggestOptionValuesFor('bus')) { + $suggestions->suggestValues($this->busIds); + } + } + private function convertToBytes(string $memoryLimit): int { $memoryLimit = strtolower($memoryLimit); diff --git a/src/Symfony/Component/Messenger/DependencyInjection/MessengerPass.php b/src/Symfony/Component/Messenger/DependencyInjection/MessengerPass.php index 959f053cc8d77..1c5bb63634ccb 100644 --- a/src/Symfony/Component/Messenger/DependencyInjection/MessengerPass.php +++ b/src/Symfony/Component/Messenger/DependencyInjection/MessengerPass.php @@ -17,6 +17,7 @@ use Symfony\Component\DependencyInjection\Compiler\ServiceLocatorTagPass; use Symfony\Component\DependencyInjection\ContainerBuilder; use Symfony\Component\DependencyInjection\Definition; +use Symfony\Component\DependencyInjection\Exception\OutOfBoundsException; use Symfony\Component\DependencyInjection\Exception\RuntimeException; use Symfony\Component\DependencyInjection\Reference; use Symfony\Component\Messenger\Handler\HandlerDescriptor; @@ -309,6 +310,11 @@ private function registerReceivers(ContainerBuilder $container, array $busIds) } $consumeCommandDefinition->replaceArgument(4, array_values($receiverNames)); + try { + $consumeCommandDefinition->replaceArgument(6, $busIds); + } catch (OutOfBoundsException $e) { + // ignore to preserve compatibility with symfony/framework-bundle < 5.4 + } } if ($container->hasDefinition('console.command.messenger_setup_transports')) { diff --git a/src/Symfony/Component/Messenger/Tests/Command/ConsumeMessagesCommandTest.php b/src/Symfony/Component/Messenger/Tests/Command/ConsumeMessagesCommandTest.php index 208f16b44ddc0..8a6f5a7d608cf 100644 --- a/src/Symfony/Component/Messenger/Tests/Command/ConsumeMessagesCommandTest.php +++ b/src/Symfony/Component/Messenger/Tests/Command/ConsumeMessagesCommandTest.php @@ -13,6 +13,7 @@ use PHPUnit\Framework\TestCase; use Symfony\Component\Console\Application; +use Symfony\Component\Console\Tester\CommandCompletionTester; use Symfony\Component\Console\Tester\CommandTester; use Symfony\Component\DependencyInjection\ContainerInterface; use Symfony\Component\DependencyInjection\ServiceLocator; @@ -150,4 +151,25 @@ public function testRunWithResetServicesOption(bool $shouldReset) $tester->assertCommandIsSuccessful(); $this->assertStringContainsString('[OK] Consuming messages from transports "dummy-receiver"', $tester->getDisplay()); } + + /** + * @dataProvider provideCompletionSuggestions + */ + public function testComplete(array $input, array $expectedSuggestions) + { + $bus = $this->createMock(RoutableMessageBus::class); + $receiverLocator = $this->createMock(ContainerInterface::class); + $command = new ConsumeMessagesCommand($bus, $receiverLocator, new EventDispatcher(), null, ['async', 'async_high', 'failed'], null, ['messenger.bus.default']); + $tester = new CommandCompletionTester($command); + $suggestions = $tester->complete($input); + $this->assertSame($expectedSuggestions, $suggestions); + } + + public function provideCompletionSuggestions() + { + yield 'receiver' => [[''], ['async', 'async_high', 'failed']]; + yield 'receiver (value)' => [['async'], ['async', 'async_high', 'failed']]; + yield 'receiver (no repeat)' => [['async', ''], ['async_high', 'failed']]; + yield 'option --bus' => [['--bus', ''], ['messenger.bus.default']]; + } }