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

Skip to content
Sign in

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Appearance settings

Commit d49d490

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

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