From fe3d91247aae72bf4fa3773b590aa8e1c5871c3f Mon Sep 17 00:00:00 2001 From: Mark van den Berg Date: Tue, 1 Feb 2022 22:31:06 +0100 Subject: [PATCH 1/2] [Messenger] Allow AsMessageHandler attribute on methods --- .../DependencyInjection/FrameworkExtension.php | 9 +++++++-- .../Messenger/Attribute/AsMessageHandler.php | 2 +- src/Symfony/Component/Messenger/CHANGELOG.md | 1 + .../DependencyInjection/MessengerPassTest.php | 17 +++++++++++++++-- .../Tests/Fixtures/TaggedDummyHandler.php | 5 +++++ 5 files changed, 29 insertions(+), 5 deletions(-) diff --git a/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/FrameworkExtension.php b/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/FrameworkExtension.php index 7f00aa012e452..54075a42b3e36 100644 --- a/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/FrameworkExtension.php +++ b/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/FrameworkExtension.php @@ -622,11 +622,16 @@ public function load(array $configs, ContainerBuilder $container) $container->registerAttributeForAutoconfiguration(AsController::class, static function (ChildDefinition $definition, AsController $attribute): void { $definition->addTag('controller.service_arguments'); }); - $container->registerAttributeForAutoconfiguration(AsMessageHandler::class, static function (ChildDefinition $definition, AsMessageHandler $attribute): void { + $container->registerAttributeForAutoconfiguration(AsMessageHandler::class, static function (ChildDefinition $definition, AsMessageHandler $attribute, \ReflectionClass|\ReflectionMethod $reflector): void { $tagAttributes = get_object_vars($attribute); $tagAttributes['from_transport'] = $tagAttributes['fromTransport']; unset($tagAttributes['fromTransport']); - + if ($reflector instanceof \ReflectionMethod) { + if (isset($tagAttributes['method'])) { + throw new LogicException(sprintf('AsMessageHandler attribute cannot declare a method on "%s::%s()".', $reflector->class, $reflector->name)); + } + $tagAttributes['method'] = $reflector->getName(); + } $definition->addTag('messenger.message_handler', $tagAttributes); }); diff --git a/src/Symfony/Component/Messenger/Attribute/AsMessageHandler.php b/src/Symfony/Component/Messenger/Attribute/AsMessageHandler.php index 8c12a80343dc2..c25c8b2c974dc 100644 --- a/src/Symfony/Component/Messenger/Attribute/AsMessageHandler.php +++ b/src/Symfony/Component/Messenger/Attribute/AsMessageHandler.php @@ -16,7 +16,7 @@ * * @author Alireza Mirsepassi */ -#[\Attribute(\Attribute::TARGET_CLASS)] +#[\Attribute(\Attribute::TARGET_CLASS | \Attribute::TARGET_METHOD)] class AsMessageHandler { public function __construct( diff --git a/src/Symfony/Component/Messenger/CHANGELOG.md b/src/Symfony/Component/Messenger/CHANGELOG.md index 98193ec5c02c4..eb046550bdfbf 100644 --- a/src/Symfony/Component/Messenger/CHANGELOG.md +++ b/src/Symfony/Component/Messenger/CHANGELOG.md @@ -6,6 +6,7 @@ CHANGELOG * Add `SerializedMessageStamp` to avoid serializing a message when a retry occurs. * Automatically resolve handled message type when method different from `__invoke` is used as handler. + * Allow `#[AsMessageHandler]` attribute on methods. 6.0 --- diff --git a/src/Symfony/Component/Messenger/Tests/DependencyInjection/MessengerPassTest.php b/src/Symfony/Component/Messenger/Tests/DependencyInjection/MessengerPassTest.php index e424236804c92..cd3c7a5087b13 100644 --- a/src/Symfony/Component/Messenger/Tests/DependencyInjection/MessengerPassTest.php +++ b/src/Symfony/Component/Messenger/Tests/DependencyInjection/MessengerPassTest.php @@ -18,6 +18,7 @@ use Symfony\Component\DependencyInjection\Compiler\ResolveClassPass; use Symfony\Component\DependencyInjection\Compiler\ResolveInstanceofConditionalsPass; use Symfony\Component\DependencyInjection\ContainerBuilder; +use Symfony\Component\DependencyInjection\Exception\LogicException; use Symfony\Component\DependencyInjection\Exception\RuntimeException; use Symfony\Component\DependencyInjection\Reference; use Symfony\Component\DependencyInjection\ServiceLocator; @@ -142,10 +143,16 @@ public function testHandledMessageTypeResolvedWithMethodAndNoHandlesViaTagAttrib public function testTaggedMessageHandler() { $container = $this->getContainerBuilder($busId = 'message_bus'); - $container->registerAttributeForAutoconfiguration(AsMessageHandler::class, static function (ChildDefinition $definition, AsMessageHandler $attribute): void { + $container->registerAttributeForAutoconfiguration(AsMessageHandler::class, static function (ChildDefinition $definition, AsMessageHandler $attribute, \ReflectionClass|\ReflectionMethod $reflector): void { $tagAttributes = get_object_vars($attribute); $tagAttributes['from_transport'] = $tagAttributes['fromTransport']; unset($tagAttributes['fromTransport']); + if ($reflector instanceof \ReflectionMethod) { + if (isset($tagAttributes['method'])) { + throw new LogicException(sprintf('AsMessageHandler attribute cannot declare a method on "%s::%s()".', $reflector->class, $reflector->name)); + } + $tagAttributes['method'] = $reflector->getName(); + } $definition->addTag('messenger.message_handler', $tagAttributes); }); @@ -162,9 +169,15 @@ public function testTaggedMessageHandler() $this->assertSame(HandlersLocator::class, $handlersLocatorDefinition->getClass()); $handlerDescriptionMapping = $handlersLocatorDefinition->getArgument(0); - $this->assertCount(1, $handlerDescriptionMapping); + $this->assertCount(2, $handlerDescriptionMapping); $this->assertHandlerDescriptor($container, $handlerDescriptionMapping, DummyMessage::class, [TaggedDummyHandler::class], [[]]); + $this->assertHandlerDescriptor( + $container, + $handlerDescriptionMapping, + SecondMessage::class, + [[TaggedDummyHandler::class, 'handleSecondMessage']] + ); } public function testProcessHandlersByBus() diff --git a/src/Symfony/Component/Messenger/Tests/Fixtures/TaggedDummyHandler.php b/src/Symfony/Component/Messenger/Tests/Fixtures/TaggedDummyHandler.php index 6007a601ba791..cecd6f2e85d49 100644 --- a/src/Symfony/Component/Messenger/Tests/Fixtures/TaggedDummyHandler.php +++ b/src/Symfony/Component/Messenger/Tests/Fixtures/TaggedDummyHandler.php @@ -10,4 +10,9 @@ class TaggedDummyHandler public function __invoke(DummyMessage $message) { } + + #[AsMessageHandler] + public function handleSecondMessage(SecondMessage $message) + { + } } From fc19ed5852dc61ec7e6af00e8b4813d41da2a154 Mon Sep 17 00:00:00 2001 From: Fabien Potencier Date: Sat, 26 Mar 2022 17:07:44 +0100 Subject: [PATCH 2/2] Fix deps --- src/Symfony/Bundle/FrameworkBundle/composer.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Symfony/Bundle/FrameworkBundle/composer.json b/src/Symfony/Bundle/FrameworkBundle/composer.json index 403837235da18..2a24a887afd4a 100644 --- a/src/Symfony/Bundle/FrameworkBundle/composer.json +++ b/src/Symfony/Bundle/FrameworkBundle/composer.json @@ -47,7 +47,7 @@ "symfony/http-client": "^5.4|^6.0", "symfony/lock": "^5.4|^6.0", "symfony/mailer": "^5.4|^6.0", - "symfony/messenger": "^5.4|^6.0", + "symfony/messenger": "^6.1", "symfony/mime": "^5.4|^6.0", "symfony/notifier": "^5.4|^6.0", "symfony/process": "^5.4|^6.0",