Skip to content

Commit

Permalink
[Messenger] Fix passing options set via tags to handler descriptors
Browse files Browse the repository at this point in the history
  • Loading branch information
nicolas-grekas committed Jul 5, 2023
1 parent 350de23 commit 290ba8a
Show file tree
Hide file tree
Showing 2 changed files with 21 additions and 19 deletions.
12 changes: 5 additions & 7 deletions DependencyInjection/MessengerPass.php
Original file line number Diff line number Diff line change
Expand Up @@ -115,18 +115,16 @@ private function registerHandlers(ContainerBuilder $container, array $busIds)
$options = ['method' => $options];
}

if (!isset($options['from_transport']) && isset($tag['from_transport'])) {
$options['from_transport'] = $tag['from_transport'];
}

$priority = $tag['priority'] ?? $options['priority'] ?? 0;
$options += array_filter($tag);
unset($options['handles']);
$priority = $options['priority'] ?? 0;
$method = $options['method'] ?? '__invoke';

if (isset($options['bus'])) {
if (!\in_array($options['bus'], $busIds)) {
$messageLocation = isset($tag['handles']) ? 'declared in your tag attribute "handles"' : ($r->implementsInterface(MessageSubscriberInterface::class) ? sprintf('returned by method "%s::getHandledMessages()"', $r->getName()) : sprintf('used as argument type in method "%s::%s()"', $r->getName(), $method));

throw new RuntimeException(sprintf('Invalid configuration "%s" for message "%s": bus "%s" does not exist.', $messageLocation, $message, $options['bus']));
throw new RuntimeException(sprintf('Invalid configuration '.$messageLocation.' for message "%s": bus "%s" does not exist.', $message, $options['bus']));
}

$buses = [$options['bus']];
Expand All @@ -135,7 +133,7 @@ private function registerHandlers(ContainerBuilder $container, array $busIds)
if ('*' !== $message && !class_exists($message) && !interface_exists($message, false)) {
$messageLocation = isset($tag['handles']) ? 'declared in your tag attribute "handles"' : ($r->implementsInterface(MessageSubscriberInterface::class) ? sprintf('returned by method "%s::getHandledMessages()"', $r->getName()) : sprintf('used as argument type in method "%s::%s()"', $r->getName(), $method));

throw new RuntimeException(sprintf('Invalid handler service "%s": class or interface "%s" "%s" not found.', $serviceId, $message, $messageLocation));
throw new RuntimeException(sprintf('Invalid handler service "%s": class or interface "%s" '.$messageLocation.' not found.', $serviceId, $message));
}

if (!$r->hasMethod($method)) {
Expand Down
28 changes: 16 additions & 12 deletions Tests/DependencyInjection/MessengerPassTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -170,13 +170,15 @@ public function testProcessHandlersByBus()
$container,
$commandBusHandlersLocatorDefinition->getArgument(0),
MultipleBusesMessage::class,
[MultipleBusesMessageHandler::class]
[MultipleBusesMessageHandler::class],
[['bus' => $commandBusId]]
);
$this->assertHandlerDescriptor(
$container,
$commandBusHandlersLocatorDefinition->getArgument(0),
DummyCommand::class,
[DummyCommandHandler::class]
[DummyCommandHandler::class],
[['bus' => $commandBusId]]
);

$queryBusHandlersLocatorDefinition = $container->getDefinition($queryBusId.'.messenger.handlers_locator');
Expand All @@ -185,13 +187,15 @@ public function testProcessHandlersByBus()
$container,
$queryBusHandlersLocatorDefinition->getArgument(0),
DummyQuery::class,
[DummyQueryHandler::class]
[DummyQueryHandler::class],
[['bus' => $queryBusId]]
);
$this->assertHandlerDescriptor(
$container,
$queryBusHandlersLocatorDefinition->getArgument(0),
MultipleBusesMessage::class,
[MultipleBusesMessageHandler::class]
[MultipleBusesMessageHandler::class],
[['bus' => $queryBusId]]
);
}

Expand Down Expand Up @@ -442,7 +446,7 @@ public function testItRegistersHandlersOnDifferentBuses()
public function testItThrowsAnExceptionOnUnknownBus()
{
$this->expectException(RuntimeException::class);
$this->expectExceptionMessage('Invalid configuration "returned by method "Symfony\Component\Messenger\Tests\DependencyInjection\HandlerOnUndefinedBus::getHandledMessages()"" for message "Symfony\Component\Messenger\Tests\Fixtures\DummyMessage": bus "some_undefined_bus" does not exist.');
$this->expectExceptionMessage('Invalid configuration returned by method "Symfony\Component\Messenger\Tests\DependencyInjection\HandlerOnUndefinedBus::getHandledMessages()" for message "Symfony\Component\Messenger\Tests\Fixtures\DummyMessage": bus "some_undefined_bus" does not exist.');
$container = $this->getContainerBuilder();
$container
->register(HandlerOnUndefinedBus::class, HandlerOnUndefinedBus::class)
Expand All @@ -455,7 +459,7 @@ public function testItThrowsAnExceptionOnUnknownBus()
public function testUndefinedMessageClassForHandler()
{
$this->expectException(RuntimeException::class);
$this->expectExceptionMessage('Invalid handler service "Symfony\Component\Messenger\Tests\DependencyInjection\UndefinedMessageHandler": class or interface "Symfony\Component\Messenger\Tests\DependencyInjection\UndefinedMessage" "used as argument type in method "Symfony\Component\Messenger\Tests\DependencyInjection\UndefinedMessageHandler::__invoke()"" not found.');
$this->expectExceptionMessage('Invalid handler service "Symfony\Component\Messenger\Tests\DependencyInjection\UndefinedMessageHandler": class or interface "Symfony\Component\Messenger\Tests\DependencyInjection\UndefinedMessage" used as argument type in method "Symfony\Component\Messenger\Tests\DependencyInjection\UndefinedMessageHandler::__invoke()" not found.');
$container = $this->getContainerBuilder();
$container
->register(UndefinedMessageHandler::class, UndefinedMessageHandler::class)
Expand All @@ -468,7 +472,7 @@ public function testUndefinedMessageClassForHandler()
public function testUndefinedMessageClassForHandlerImplementingMessageHandlerInterface()
{
$this->expectException(RuntimeException::class);
$this->expectExceptionMessage('Invalid handler service "Symfony\Component\Messenger\Tests\DependencyInjection\UndefinedMessageHandlerViaHandlerInterface": class or interface "Symfony\Component\Messenger\Tests\DependencyInjection\UndefinedMessage" "used as argument type in method "Symfony\Component\Messenger\Tests\DependencyInjection\UndefinedMessageHandlerViaHandlerInterface::__invoke()"" not found.');
$this->expectExceptionMessage('Invalid handler service "Symfony\Component\Messenger\Tests\DependencyInjection\UndefinedMessageHandlerViaHandlerInterface": class or interface "Symfony\Component\Messenger\Tests\DependencyInjection\UndefinedMessage" used as argument type in method "Symfony\Component\Messenger\Tests\DependencyInjection\UndefinedMessageHandlerViaHandlerInterface::__invoke()" not found.');
$container = $this->getContainerBuilder();
$container
->register(UndefinedMessageHandlerViaHandlerInterface::class, UndefinedMessageHandlerViaHandlerInterface::class)
Expand All @@ -481,7 +485,7 @@ public function testUndefinedMessageClassForHandlerImplementingMessageHandlerInt
public function testUndefinedMessageClassForHandlerImplementingMessageSubscriberInterface()
{
$this->expectException(RuntimeException::class);
$this->expectExceptionMessage('Invalid handler service "Symfony\Component\Messenger\Tests\DependencyInjection\UndefinedMessageHandlerViaSubscriberInterface": class or interface "Symfony\Component\Messenger\Tests\DependencyInjection\UndefinedMessage" "returned by method "Symfony\Component\Messenger\Tests\DependencyInjection\UndefinedMessageHandlerViaSubscriberInterface::getHandledMessages()"" not found.');
$this->expectExceptionMessage('Invalid handler service "Symfony\Component\Messenger\Tests\DependencyInjection\UndefinedMessageHandlerViaSubscriberInterface": class or interface "Symfony\Component\Messenger\Tests\DependencyInjection\UndefinedMessage" returned by method "Symfony\Component\Messenger\Tests\DependencyInjection\UndefinedMessageHandlerViaSubscriberInterface::getHandledMessages()" not found.');
$container = $this->getContainerBuilder();
$container
->register(UndefinedMessageHandlerViaSubscriberInterface::class, UndefinedMessageHandlerViaSubscriberInterface::class)
Expand Down Expand Up @@ -713,12 +717,12 @@ public function testItRegistersTheDebugCommand()

$this->assertEquals([
$commandBusId => [
DummyCommand::class => [[DummyCommandHandler::class, []]],
MultipleBusesMessage::class => [[MultipleBusesMessageHandler::class, []]],
DummyCommand::class => [[DummyCommandHandler::class, ['bus' => $commandBusId]]],
MultipleBusesMessage::class => [[MultipleBusesMessageHandler::class, ['bus' => $commandBusId]]],
],
$queryBusId => [
DummyQuery::class => [[DummyQueryHandler::class, []]],
MultipleBusesMessage::class => [[MultipleBusesMessageHandler::class, []]],
DummyQuery::class => [[DummyQueryHandler::class, ['bus' => $queryBusId]]],
MultipleBusesMessage::class => [[MultipleBusesMessageHandler::class, ['bus' => $queryBusId]]],
],
$emptyBus => [],
], $container->getDefinition('console.command.messenger_debug')->getArgument(0));
Expand Down

0 comments on commit 290ba8a

Please sign in to comment.