8000 [Messenger] fix support for abstract handlers · symfony/symfony@61c54c2 · GitHub
[go: up one dir, main page]

Skip to content

Commit 61c54c2

Browse files
timiTaonicolas-grekas
authored andcommitted
[Messenger] fix support for abstract handlers
1 parent 853743a commit 61c54c2

File tree

2 files changed

+46
-2
lines changed

2 files changed

+46
-2
lines changed

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

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@ private function registerHandlers(ContainerBuilder $container, array $busIds)
7979
throw new RuntimeException(sprintf('Invalid handler service "%s": bus "%s" specified on the tag "%s" does not exist (known ones are: %s).', $serviceId, $tag['bus'], $this->handlerTag, implode(', ', $busIds)));
8080
}
8181

82-
$className = $container->getDefinition($serviceId)->getClass();
82+
$className = $this->getServiceClass($container, $serviceId);
8383
$r = $container->getReflectionClass($className);
8484

8585
if (null === $r) {
@@ -229,7 +229,7 @@ private function registerReceivers(ContainerBuilder $container, array $busIds)
229229
$receiverMapping = [];
230230

231231
foreach ($container->findTaggedServiceIds($this->receiverTag) as $id => $tags) {
232-
$receiverClass = $container->findDefinition($id)->getClass();
232+
$receiverClass = $this->getServiceClass($container, $id);
233233
if (!is_subclass_of($receiverClass, ReceiverInterface::class)) {
234234
throw new RuntimeException(sprintf('Invalid receiver "%s": class "%s" must implement interface "%s".', $id, $receiverClass, ReceiverInterface::class));
235235
}
@@ -321,4 +321,19 @@ private function registerBusMiddleware(ContainerBuilder $container, string $busI
321321

322322
$container->getDefinition($busId)->replaceArgument(0, new IteratorArgument($middlewareReferences));
323323
}
324+
325+
private function getServiceClass(ContainerBuilder $container, string $serviceId)
326+
{
327+
while (true) {
328+
$definition = $container->findDefinition($serviceId);
329+
330+
if (!$definition->getClass() && $definition instanceof ChildDefinition) {
331+
$serviceId = $definition->getParent();
332+
333+
continue;
334+
}
335+
336+
return $definition->getClass();
337+
}
338+
}
324339
}

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

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
namespace Symfony\Component\Messenger\Tests\DependencyInjection;
1313

1414
use PHPUnit\Framework\TestCase;
15+
use Symfony\Component\DependencyInjection\ChildDefinition;
1516
use Symfony\Component\DependencyInjection\Compiler\ResolveChildDefinitionsPass;
1617
use Symfony\Component\DependencyInjection\Compiler\ResolveClassPass;
1718
use Symfony\Component\DependencyInjection\ContainerBuilder;
@@ -208,6 +209,34 @@ public function testGetClassesAndMethodsAndPrioritiesFromTheSubscriber()
208209
$this->assertSame(PrioritizedHandler::class, $secondHandlerDefinition->getClass());
209210
}
210211

212+
public function testRegisterAbstractHandler()
213+
{
214+
$container = $this->getContainerBuilder($messageBusId = 'message_bus');
215+
$container->register($messageBusId, MessageBusInterface::class)->addTag('messenger.bus')->setArgument(0, []);
216+
217+
$container
218+
->register(DummyHandler::class, DummyHandler::class)
219+
->setAbstract(true);
220+
221+
$container
222+
->setDefinition($abstractDirectChildId = 'direct_child', new ChildDefinition(DummyHandler::class))
223+
->setAbstract(true);
224+
225+
$container
226+
->setDefinition($abstractHandlerId = 'child', new ChildDefinition($abstractDirectChildId))
227+
->addTag('messenger.message_handler');
228+
229+
(new MessengerPass())->process($container);
230+
231+
$messageHandlerMapping = $container->getDefinition($messageBusId.'.messenger.handlers_locator')->getArgument(0);
232+
$this->assertHandlerDescriptor(
233+
$container,
234+
$messageHandlerMapping,
235+
DummyMessage::class,
236+
[$abstractHandlerId]
237+
);
238+
}
239+
211240
/**
212241
* @expectedException \Symfony\Component\DependencyInjection\Exception\RuntimeException
213242
* @expectedExceptionMessage Invalid service "NonExistentHandlerClass": class "NonExistentHandlerClass" does not exist.

0 commit comments

Comments
 (0)
0