Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 6fc6879

Browse files
committed
Only subscribe to a given bus from the MessageSubscriber
1 parent ff1727e commit 6fc6879

File tree

2 files changed

+64
-3
lines changed

2 files changed

+64
-3
lines changed

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

Lines changed: 20 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,7 @@ private function registerHandlers(ContainerBuilder $container, array $busIds)
9797
$handlerBuses = (array) ($tag['bus'] ?? $busIds);
9898

9999
foreach ($handles as $messageClass => $method) {
100+
$buses = $handlerBuses;
100101
if (\is_int($messageClass)) {
101102
$messageClass = $method;
102103
$method = '__invoke';
@@ -110,8 +111,24 @@ private function registerHandlers(ContainerBuilder $container, array $busIds)
110111
}
111112

112113
if (\is_array($method)) {
113-
$messagePriority = $method[1];
114-
$method = $method[0];
114+
if (isset($method[0]) && isset($method[1])) {
115+
$messagePriority = $method[1];
116+
$method = $method[0];
117+
} elseif (isset($method['method']) || isset($method['bus'])) {
118+
if (isset($method['bus'])) {
119+
$buses = array($method['bus']);
120+
}
121+
122+
if (isset($method['priority'])) {
123+
$messagePriority = $method['priority'];
124+
}
125+
126+
$method = $method['method'] ?? '__invoke';
127+
} else {
128+
$messageClassLocation = 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);
129+
130+
throw new RuntimeException(sprintf('Invalid configuration %s for message "%s".', $messageClassLocation, $messageClass));
131+
}
115132
}
116133

117134
if (!\class_exists($messageClass)) {
@@ -132,7 +149,7 @@ private function registerHandlers(ContainerBuilder $container, array $busIds)
132149
$definitionId = $serviceId;
133150
}
134151

135-
foreach ($handlerBuses as $handlerBus) {
152+
foreach ($buses as $handlerBus) {
136153
$handlersByBusAndMessage[$handlerBus][$messageClass][$messagePriority][] = $definitionId;
137154
}
138155
}

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

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -297,6 +297,33 @@ public function testItShouldNotThrowIfGeneratorIsReturnedInsteadOfArray()
297297
$this->assertEquals(array(new Reference(HandlerWithGenerators::class), 'secondMessage'), $container->getDefinition($secondReference)->getArgument(0));
298298
}
299299

300+
public function testItRegistersHandlersOnDifferentBuses()
301+
{
302+
$container = $this->getContainerBuilder($eventsBusId = 'event_bus');
303+
$container->register($commandsBusId = 'command_bus', MessageBusInterface::class)->addTag('messenger.bus')->setArgument(0, array());
304+
305+
$container
306+
->register(HandlerOnSpecificBuses::class, HandlerOnSpecificBuses::class)
307+
->addTag('messenger.message_handler')
308+
;
309+
310+
(new MessengerPass())->process($container);
311+
312+
$eventsHandlerLocatorDefinition = $container->getDefinition($container->getDefinition($eventsBusId.'.messenger.handler_resolver')->getArgument(0));
313+
$eventsHandlerMapping = $eventsHandlerLocatorDefinition->getArgument(0);
314+
315+
$this->assertEquals(array('handler.'.DummyMessage::class), array_keys($eventsHandlerMapping));
316+
$firstReference = $eventsHandlerMapping['handler.'.DummyMessage::class]->getValues()[0];
317+
$this->assertEquals(array(new Reference(HandlerOnSpecificBuses::class), 'dummyMethodForEvents'), $container->getDefinition($firstReference)->getArgument(0));
318+
319+
$commandsHandlerLocatorDefinition = $container->getDefinition($container->getDefinition($commandsBusId.'.messenger.handler_resolver')->getArgument(0));
320+
$commandsHandlerMapping = $commandsHandlerLocatorDefinition->getArgument(0);
321+
322+
$this->assertEquals(array('handler.'.DummyMessage::class), array_keys($commandsHandlerMapping));
323+
$firstReference = $commandsHandlerMapping['handler.'.DummyMessage::class]->getValues()[0];
324+
$this->assertEquals(array(new Reference(HandlerOnSpecificBuses::class), 'dummyMethodForCommands'), $container->getDefinition($firstReference)->getArgument(0));
325+
}
326+
300327
/**
301328
* @expectedException \Symfony\Component\DependencyInjection\Exception\RuntimeException
302329
* @expectedExceptionMessage Invalid sender "app.messenger.sender": class "Symfony\Component\Messenger\Tests\DependencyInjection\InvalidSender" must implement interface "Symfony\Component\Messenger\Transport\SenderInterface".
@@ -747,6 +774,23 @@ public function secondMessage()
747774
}
748775
}
749776

777+
class HandlerOnSpecificBuses implements MessageSubscriberInterface
778+
{
779+
public static function getHandledMessages(): iterable
780+
{
781+
yield DummyMessage::class => ['method' => 'dummyMethodForEvents', 'bus' => 'event_bus'];
782+
yield DummyMessage::class => ['method' => 'dummyMethodForCommands', 'bus' => 'command_bus'];
783+
}
784+
785+
public function dummyMethodForEvents()
786+
{
787+
}
788+
789+
public function dummyMethodForCommands()
790+
{
791+
}
792+
}
793+
750794
class UselessMiddleware implements MiddlewareInterface
751795
{
752796
public function handle($message, callable $next)

0 commit comments

Comments
 (0)