diff --git a/src/Symfony/Bundle/FrameworkBundle/Resources/config/messenger.xml b/src/Symfony/Bundle/FrameworkBundle/Resources/config/messenger.xml index 14ffd4d3827a..85a1a432615d 100644 --- a/src/Symfony/Bundle/FrameworkBundle/Resources/config/messenger.xml +++ b/src/Symfony/Bundle/FrameworkBundle/Resources/config/messenger.xml @@ -106,6 +106,7 @@ + diff --git a/src/Symfony/Component/Messenger/RoutableMessageBus.php b/src/Symfony/Component/Messenger/RoutableMessageBus.php index cb1e2ae6273a..c0f7eeca1b9a 100644 --- a/src/Symfony/Component/Messenger/RoutableMessageBus.php +++ b/src/Symfony/Component/Messenger/RoutableMessageBus.php @@ -28,13 +28,15 @@ class RoutableMessageBus implements MessageBusInterface { private $busLocator; + private $fallbackBus; /** * @param ContainerInterface $busLocator A locator full of MessageBusInterface objects */ - public function __construct(ContainerInterface $busLocator) + public function __construct(ContainerInterface $busLocator, MessageBusInterface $fallbackBus = null) { $this->busLocator = $busLocator; + $this->fallbackBus = $fallbackBus; } public function dispatch($envelope, array $stamps = []): Envelope @@ -43,14 +45,28 @@ public function dispatch($envelope, array $stamps = []): Envelope throw new InvalidArgumentException('Messages passed to RoutableMessageBus::dispatch() must be inside an Envelope'); } - /** @var BusNameStamp $busNameStamp */ + return $this->getMessageBus($envelope)->dispatch($envelope, $stamps); + } + + private function getMessageBus(Envelope $envelope): MessageBusInterface + { + /** @var BusNameStamp|null $busNameStamp */ $busNameStamp = $envelope->last(BusNameStamp::class); - $busName = null !== $busNameStamp ? $busNameStamp->getBusName() : MessageBusInterface::class; + + if (null === $busNameStamp) { + if (null === $this->fallbackBus) { + throw new InvalidArgumentException(sprintf('Envelope is missing a BusNameStamp and no fallback message bus is configured on RoutableMessageBus.')); + } + + return $this->fallbackBus; + } + + $busName = $busNameStamp->getBusName(); if (!$this->busLocator->has($busName)) { throw new InvalidArgumentException(sprintf('Bus named "%s" does not exist.', $busName)); } - return $this->busLocator->get($busName)->dispatch($envelope, $stamps); + return $this->busLocator->get($busName); } } diff --git a/src/Symfony/Component/Messenger/Tests/RoutableMessageBusTest.php b/src/Symfony/Component/Messenger/Tests/RoutableMessageBusTest.php index c778fd7cbee1..ef970d3838c7 100644 --- a/src/Symfony/Component/Messenger/Tests/RoutableMessageBusTest.php +++ b/src/Symfony/Component/Messenger/Tests/RoutableMessageBusTest.php @@ -50,41 +50,34 @@ public function testItRoutesToDefaultBus() ->willReturn($envelope); $container = $this->createMock(ContainerInterface::class); - $container->expects($this->once())->method('has')->with(MessageBusInterface::class) - ->willReturn(true); - $container->expects($this->once())->method('get')->with(MessageBusInterface::class) - ->willReturn($defaultBus); - $routableBus = new RoutableMessageBus($container); + $routableBus = new RoutableMessageBus($container, $defaultBus); $this->assertSame($envelope, $routableBus->dispatch($envelope, [$stamp])); } - public function testItExceptionOnDefaultBusNotFound() + public function testItExceptionOnBusNotFound() { $this->expectException(InvalidArgumentException::class); - $this->expectExceptionMessage(sprintf('Bus named "%s" does not exist.', MessageBusInterface::class)); + $this->expectExceptionMessage('Bus named "my_cool_bus" does not exist.'); - $envelope = new Envelope(new \stdClass()); + $envelope = new Envelope(new \stdClass(), [ + new BusNameStamp('my_cool_bus'), + ]); $container = $this->createMock(ContainerInterface::class); - $container->expects($this->once())->method('has')->with(MessageBusInterface::class) - ->willReturn(false); - $routableBus = new RoutableMessageBus($container); $routableBus->dispatch($envelope); } - public function testItExceptionOnBusNotFound() + public function testItExceptionOnDefaultBusNotFound() { $this->expectException(InvalidArgumentException::class); - $this->expectExceptionMessage(sprintf('Bus named "%s" does not exist.', 'foo_bus')); + $this->expectExceptionMessage('Envelope is missing a BusNameStamp and no fallback message bus is configured on RoutableMessageBus.'); - $envelope = new Envelope(new \stdClass(), [new BusNameStamp('foo_bus')]); + $envelope = new Envelope(new \stdClass()); $container = $this->createMock(ContainerInterface::class); - $container->expects($this->once())->method('has')->willReturn(false); - $routableBus = new RoutableMessageBus($container); $routableBus->dispatch($envelope); }