10000 [Messenger] Resolve handled classes when only method is provided · symfony/symfony@b0c3eae · GitHub
[go: up one dir, main page]

Skip to content

Commit b0c3eae

Browse files
committed
[Messenger] Resolve handled classes when only method is provided
1 parent b41251a commit b0c3eae

File tree

3 files changed

+63
-8
lines changed

3 files changed

+63
-8
lines changed

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

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,7 @@ private function registerHandlers(ContainerBuilder $container, array $busIds)
9393
if (isset($tag['handles'])) {
9494
$handles = isset($tag['method']) ? [$tag['handles'] => $tag['method']] : [$tag['handles']];
9595
} else {
96-
$handles = $this->guessHandledClasses($r, $serviceId);
96+
$handles = $this->guessHandledClasses($r, $serviceId, $tag['method'] ?? null);
9797
}
9898

9999
$message = null;
@@ -212,25 +212,27 @@ private function registerHandlers(ContainerBuilder $container, array $busIds)
212212
}
213213
}
214214

215-
private function guessHandledClasses(\ReflectionClass $handlerClass, string $serviceId): iterable
215+
private function guessHandledClasses(\ReflectionClass $handlerClass, string $serviceId, ?string $methodName): iterable
216216
{
217+
$methodName = $methodName ?? '__invoke';
218+
217219
if ($handlerClass->implementsInterface(MessageSubscriberInterface::class)) {
218220
return $handlerClass->getName()::getHandledMessages();
219221
}
220222

221223
try {
222-
$method = $handlerClass->getMethod('__invoke');
224+
$method = $handlerClass->getMethod($methodName);
223225
} catch (\ReflectionException $e) {
224-
throw new RuntimeException(sprintf('Invalid handler service "%s": class "%s" must have an "__invoke()" method.', $serviceId, $handlerClass->getName()));
226+
throw new RuntimeException(sprintf('Invalid handler service "%s": class "%s" must have an "%s()" method.', $serviceId, $handlerClass->getName(), $methodName));
225227
}
226228

227229
if (0 === $method->getNumberOfRequiredParameters()) {
228-
throw new RuntimeException(sprintf('Invalid handler service "%s": method "%s::__invoke()" requires at least one argument, first one being the message it handles.', $serviceId, $handlerClass->getName()));
230+
throw new RuntimeException(sprintf('Invalid handler service "%s": method "%s::%s()" requires at least one argument, first one being the message it handles.', $serviceId, $handlerClass->getName(), $methodName));
229231
}
230232

231233
$parameters = $method->getParameters();
232234
if (!$type = $parameters[0]->getType()) {
233-
throw new RuntimeException(sprintf('Invalid handler service "%s": argument "$%s" of method "%s::__invoke()" must have a type-hint corresponding to the message class it handles.', $serviceId, $parameters[0]->getName(), $handlerClass->getName()));
235+
throw new RuntimeException(sprintf('Invalid handler service "%s": argument "$%s" of method "%s::%s()" must have a type-hint corresponding to the message class it handles.', $serviceId, $parameters[0]->getName(), $handlerClass->getName(), $methodName));
234236
}
235237

236238
if ($type instanceof \ReflectionUnionType) {
@@ -247,10 +249,10 @@ private function guessHandledClasses(\ReflectionClass $handlerClass, string $ser
247249
}
248250

249251
if ($type->isBuiltin()) {
250-
throw new RuntimeException(sprintf('Invalid handler service "%s": type-hint of argument "$%s" in method "%s::__invoke()" must be a class , "%s" given.', $serviceId, $parameters[0]->getName(), $handlerClass->getName(), $type instanceof \ReflectionNamedType ? $type->getName() : (string) $type));
252+
throw new RuntimeException(sprintf('Invalid handler service "%s": type-hint of argument "$%s" in method "%s::%s()" must be a class , "%s" given.', $serviceId, $parameters[0]->getName(), $handlerClass->getName(), $methodName, $type instanceof \ReflectionNamedType ? $type->getName() : (string) $type));
251253
}
252254

253-
return [$type->getName()];
255+
return ($methodName === '__invoke') ? [$type->getName()] : [$type->getName() => $methodName];
254256
}
255257

256258
private function registerReceivers(ContainerBuilder $container, array $busIds)

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

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@
4747
use Symfony\Component\Messenger\Tests\Fixtures\MultipleBusesMessageHandler;
4848
use Symfony\Component\Messenger\Tests\Fixtures\SecondMessage;
4949
use Symfony\Component\Messenger\Tests\Fixtures\TaggedDummyHandler;
50+
use Symfony\Component\Messenger\Tests\Fixtures\TaggedDummyHandlerWithCustomMethods;
5051
use Symfony\Component\Messenger\Transport\Receiver\ReceiverInterface;
5152

5253
class MessengerPassTest extends TestCase
@@ -136,6 +137,41 @@ public function testTaggedMessageHandler()
136137
$this->assertHandlerDescriptor($container, $handlerDescriptionMapping, DummyMessage::class, [TaggedDummyHandler::class], [[]]);
137138
}
138139

140+
public function testTaggedMessageHandlerWithGivenMethodAndNotGivenMessageType()
141+
{
142+
$container = $this->getContainerBuilder($busId = 'message_bus');
143+
$container
144+
->register(TaggedDummyHandlerWithCustomMethods::class, TaggedDummyHandlerWithCustomMethods::class)
145+
->setAutoconfigured(true)
146+
->addTag('messenger.message_handler', [
147+
'method' => 'handleDummyMessage'
148+
])
149+
->addTag('messenger.message_handler', [
150+
'method' => 'handleSecondMessage'
151+
]);
152+
;
153+
154+
(new MessengerPass())->process($container);
155+
156+
$handlersMapping = $container->getDefinition($busId.'.messenger.handlers_locator')->getArgument(0);
157+
158+
$this->assertArrayHasKey(DummyMessage::class, $handlersMapping);
159+
$this->assertHandlerDescriptor(
160+
$container,
161+
$handlersMapping,
162+
DummyMessage::class,
163+
[[TaggedDummyHandlerWithCustomMethods::class, 'handleDummyMessage']]
164+
);
165+
166+
$this->assertArrayHasKey(SecondMessage::class, $handlersMapping);
167+
$this->assertHandlerDescriptor(
168+
$container,
169+
$handlersMapping,
170+
SecondMessage::class,
171+
[[TaggedDummyHandlerWithCustomMethods::class, 'handleSecondMessage']]
172+
);
173+
}
174+
139175
public function testProcessHandlersByBus()
140176
{
141177
$container = $this->getContainerBuilder($commandBusId = 'command_bus');
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
<?php
2+
3+
namespace Symfony\Component\Messenger\Tests\Fixtures;
4+
5+
use Symfony\Component\Messenger\Attribute\AsMessageHandler;
6+
7+
#[AsMessageHandler]
8+
class TaggedDummyHandlerWithCustomMethods
9+
{
10+
public function handleDummyMessage(DummyMessage $message)
11+
{
12+
}
13+
14+
public function handleSecondMessage(SecondMessage $message)
15+
{
16+
}
17+
}

0 commit comments

Comments
 (0)
0