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

Skip to content

Commit f69f116

Browse files
committed
[Messenger] Resolve handled classes when only method is provided
1 parent 4b41d17 commit f69f116

File tree

3 files changed

+62
-8
lines changed

3 files changed

+62
-8
lines changed

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

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,7 @@ private function registerHandlers(ContainerBuilder $container, array $busIds)
7878
if (isset($tag['handles'])) {
7979
$handles = isset($tag['method']) ? [$tag['handles'] => $tag['method']] : [$tag['handles']];
8080
} else {
81-
$handles = $this->guessHandledClasses($r, $serviceId);
81+
$handles = $this->guessHandledClasses($r, $serviceId, $tag['method'] ?? null);
8282
}
8383

8484
$message = null;
@@ -197,25 +197,27 @@ private function registerHandlers(ContainerBuilder $container, array $busIds)
197197
}
198198
}
199199

200-
private function guessHandledClasses(\ReflectionClass $handlerClass, string $serviceId): iterable
200+
private function guessHandledClasses(\ReflectionClass $handlerClass, string $serviceId, ?string $methodName): iterable
201201
{
202+
$methodName = $methodName ?? '__invoke';
203+
202204
if ($handlerClass->implementsInterface(MessageSubscriberInterface::class)) {
203205
return $handlerClass->getName()::getHandledMessages();
204206
}
205207

206208
try {
207-
$method = $handlerClass->getMethod('__invoke');
209+
$method = $handlerClass->getMethod($methodName);
208210
} catch (\ReflectionException $e) {
209-
throw new RuntimeException(sprintf('Invalid handler service "%s": class "%s" must have an "__invoke()" method.', $serviceId, $handlerClass->getName()));
211+
throw new RuntimeException(sprintf('Invalid handler service "%s": class "%s" must have an "%s()" method.', $serviceId, $handlerClass->getName(), $methodName));
210212
}
211213

212214
if (0 === $method->getNumberOfRequiredParameters()) {
213-
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()));
215+
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));
214216
}
215217

216218
$parameters = $method->getParameters();
217219
if (!$type = $parameters[0]->getType()) {
218-
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()));
220+
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));
219221
}
220222

221223
if ($type instanceof \ReflectionUnionType) {
@@ -232,10 +234,10 @@ private function guessHandledClasses(\ReflectionClass $handlerClass, string $ser
232234
}
233235

234236
if ($type->isBuiltin()) {
235-
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));
237+
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));
236238
}
237239

238-
return [$type->getName()];
240+
return ('__invoke' === $methodName) ? [$type->getName()] : [$type->getName() => $methodName];
239241
}
240242

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

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

Lines changed: 35 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
@@ -133,6 +134,40 @@ public function testTaggedMessageHandler()
133134
$this->assertHandlerDescriptor($container, $handlerDescriptionMapping, DummyMessage::class, [TaggedDummyHandler::class], [[]]);
134135
}
135136

137+
public function testTaggedMessageHandlerWithGivenMethodAndNotGivenMessageType()
138+
{
139+
$container = $this->getContainerBuilder($busId = 'message_bus');
140+
$container
141+
->register(TaggedDummyHandlerWithCustomMethods::class, TaggedDummyHandlerWithCustomMethods::class)
142+
->setAutoconfigured(true)
143+
->addTag('messenger.message_handler', [
144+
'method' => 'handleDummyMessage',
145+
])
146+
->addTag('messenger.message_handler', [
147+
'method' => 'handleSecondMessage',
148+
]);
149+
150+
(new MessengerPass())->process($container);
151+
152+
$handlersMapping = $container->getDefinition($busId.'.messenger.handlers_locator')->getArgument(0);
153+
154+
$this->assertArrayHasKey(DummyMessage::class, $handlersMapping);
155+
$this->assertHandlerDescriptor(
156+
$container,
157+
$handlersMapping,
158+
DummyMessage::class,
159+
[[TaggedDummyHandlerWithCustomMethods::class, 'handleDummyMessage']]
160+
);
161+
162+
$this->assertArrayHasKey(SecondMessage::class, $handlersMapping);
163+
$this->assertHandlerDescriptor(
164+
$container,
165+
$handlersMapping,
166+
SecondMessage::class,
167+
[[TaggedDummyHandlerWithCustomMethods::class, 'handleSecondMessage']]
168+
);
169+
}
170+
136171
public function testProcessHandlersByBus()
137172
{
138173
$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