8000 add abstract handler · symfony/symfony@17d5a2d · GitHub
[go: up one dir, main page]

Skip to content

Commit 17d5a2d

Browse files
committed
add abstract handler
1 parent 853743a commit 17d5a2d

File tree

2 files changed

+43
-1
lines changed

2 files changed

+43
-1
lines changed

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

Lines changed: 14 additions & 1 deletion
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->getDefinitionClass($serviceId, $container);
8383
$r = $container->getReflectionClass($className);
8484

8585
if (null === $r) {
@@ -321,4 +321,17 @@ private function registerBusMiddleware(ContainerBuilder $container, string $busI
321321

322322
$container->getDefinition($busId)->replaceArgument(0, new IteratorArgument($middlewareReferences));
323323
}
324+
325+
private function getDefinitionClass(string $serviceId, ContainerBuilder $container)
326+
{
327+
$serviceIdDefinition = $container->getDefinition($serviceId);
328+
while ($serviceIdDefinition instanceof ChildDefinition) {
329+
if (null !== $serviceIdDefinition->getClass()) {
330+
break;
331+
}
332+
$serviceIdDefinition = $container->getDefinition($serviceIdDefinition->getParent());
333+
}
334+
335+
return $serviceIdDefinition->getClass();
336+
}
324337
}

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