8000 feature #31429 [Messenger] add support for abstract handlers (timiTao) · symfony/symfony@2aca43f · GitHub
[go: up one dir, main page]

Skip to content

Commit 2aca43f

Browse files
feature #31429 [Messenger] add support for abstract handlers (timiTao)
This PR was submitted for the 4.4 branch but it was merged into the 5.1-dev branch instead. Discussion ---------- [Messenger] add support for abstract handlers | Q | A | ------------- | --- | Branch? | master <!-- see below --> | Bug fix? | no | New feature? | yes <!-- don't forget to update src/**/CHANGELOG.md files --> | BC breaks? | no <!-- see https://symfony.com/bc --> | Deprecations? | no <!-- don't forget to update UPGRADE-*.md and src/**/CHANGELOG.md files --> | Tests pass? | yes <!-- please add some, will be required by reviewers --> | Fixed tickets | #31417 <!-- #-prefixed issue number(s), if any --> | License | MIT | Doc PR | symfony/symfony-docs#... <!-- required for new features --> Added handling abstract handler. Commits ------- 22e59f3 [Messenger] fix support for abstract handlers
2 parents a66b645 + 22e59f3 commit 2aca43f

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
@@ -78,7 +78,7 @@ private function registerHandlers(ContainerBuilder $container, array $busIds)
7878
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)));
7979
}
8080

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

8484
if (null === $r) {
@@ -240,7 +240,7 @@ private function registerReceivers(ContainerBuilder $container, array $busIds)
240240
$receiverMapping = [];
241241

242242
foreach ($container->findTaggedServiceIds($this->receiverTag) as $id => $tags) {
243-
$receiverClass = $container->findDefinition($id)->getClass();
243+
$receiverClass = $this->getServiceClass($container, $id);
244244
if (!is_subclass_of($receiverClass, ReceiverInterface::class)) {
245245
throw new RuntimeException(sprintf('Invalid receiver "%s": class "%s" must implement interface "%s".', $id, $receiverClass, ReceiverInterface::class));
246246
}
@@ -336,4 +336,19 @@ private function registerBusMiddleware(ContainerBuilder $container, string $busI
336336

337337
$container->getDefinition($busId)->replaceArgument(0, new IteratorArgument($middlewareReferences));
338338
}
339+
340+
private function getServiceClass(ContainerBuilder $container, string $serviceId): string
341+
{
342+
while (true) {
343+
$definition = $container->findDefinition($serviceId);
344+
345+
if (!$definition->getClass() && $definition instanceof ChildDefinition) {
346+
$serviceId = $definition->getParent();
347+
348+
continue;
349+
}
350+
351+
return $definition->getClass();
352+
}
353+
}
339354
}

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;
@@ -225,6 +226,34 @@ public function testGetClassesAndMethodsAndPrioritiesFromTheSubscriber()
225226
$this->assertSame(PrioritizedHandler::class, $secondHandlerDefinition->getClass());
226227
}
227228

229+
public function testRegisterAbstractHandler()
230+
{
231+
$container = $this->getContainerBuilder($messageBusId = 'message_bus');
232+
$container->register($messageBusId, MessageBusInterface::class)->addTag('messenger.bus')->setArgument(0, []);
233+
234+
$container
235+
->register(DummyHandler::class, DummyHandler::class)
236+
->setAbstract(true);
237+
238+
$container
239+
->setDefinition($abstractDirectChildId = 'direct_child', new ChildDefinition(DummyHandler::class))
240+
->setAbstract(true);
241+
242+
$container
243+
->setDefinition($abstractHandlerId = 'child', new ChildDefinition($abstractDirectChildId))
244+
->addTag('messenger.message_handler');
245+
246+
(new MessengerPass())->process($container);
247+
248+
$messageHandlerMapping = $container->getDefinition($messageBusId.'.messenger.handlers_locator')->getArgument(0);
249+
$this->assertHandlerDescriptor(
250+
$container,
251+
$messageHandlerMapping,
252+
DummyMessage::class,
253+
[$abstractHandlerId]
254+
);
255+
}
256+
228257
public function testThrowsExceptionIfTheHandlerClassDoesNotExist()
229258
{
230259
$this->expectException('Symfony\Component\DependencyInjection\Exception\RuntimeException');

0 commit comments

Comments
 (0)
0