|
49 | 49 | use Symfony\Component\Messenger\Tests\Fixtures\MultipleBusesMessageHandler;
|
50 | 50 | use Symfony\Component\Messenger\Tests\Fixtures\SecondMessage;
|
51 | 51 | use Symfony\Component\Messenger\Tests\Fixtures\TaggedDummyHandler;
|
| 52 | +use Symfony\Component\Messenger\Tests\Fixtures\TaggedDummyHandlerWithUnionTypes; |
| 53 | +use Symfony\Component\Messenger\Tests\Fixtures\UnionTypeOneMessage; |
| 54 | +use Symfony\Component\Messenger\Tests\Fixtures\UnionTypeTwoMessage; |
52 | 55 | use Symfony\Component\Messenger\Transport\Receiver\ReceiverInterface;
|
53 | 56 |
|
54 | 57 | class MessengerPassTest extends TestCase
|
@@ -180,6 +183,54 @@ public function testTaggedMessageHandler()
|
180 | 183 | );
|
181 | 184 | }
|
182 | 185 |
|
| 186 | + public function testTaggedMessageHandlerWithUnionTypes() |
| 187 | + { |
| 188 | + $container = $this->getContainerBuilder($busId = 'message_bus'); |
| 189 | + $container->registerAttributeForAutoconfiguration(AsMessageHandler::class, static function (ChildDefinition $definition, AsMessageHandler $attribute, \ReflectionClass|\ReflectionMethod $reflector): void { |
| 190 | + $tagAttributes = get_object_vars($attribute); |
| 191 | + $tagAttributes['from_transport'] = $tagAttributes['fromTransport']; |
| 192 | + unset($tagAttributes['fromTransport']); |
| 193 | + if ($reflector instanceof \ReflectionMethod) { |
| 194 | + if (isset($tagAttributes['method'])) { |
| 195 | + throw new LogicException(sprintf('AsMessageHandler attribute cannot declare a method on "%s::%s()".', $reflector->class, $reflector->name)); |
| 196 | + } |
| 197 | + $tagAttributes['method'] = $reflector->getName(); |
| 198 | + } |
| 199 | + |
| 200 | + $definition->addTag('messenger.message_handler', $tagAttributes); |
| 201 | + }); |
| 202 | + $container |
| 203 | + ->register(TaggedDummyHandlerWithUnionTypes::class, TaggedDummyHandlerWithUnionTypes::class) |
| 204 | + ->setAutoconfigured(true) |
| 205 | + ; |
| 206 | + |
| 207 | + (new AttributeAutoconfigurationPass())->process($container); |
| 208 | + (new ResolveInstanceofConditionalsPass())->process($container); |
| 209 | + (new MessengerPass())->process($container); |
| 210 | + |
| 211 | + $handlersLocatorDefinition = $container->getDefinition($busId.'.messenger.handlers_locator'); |
| 212 | + $this->assertSame(HandlersLocator::class, $handlersLocatorDefinition->getClass()); |
| 213 | + |
| 214 | + $handlerDescriptionMapping = $handlersLocatorDefinition->getArgument(0); |
| 215 | + |
| 216 | + $this->assertCount(4, $handlerDescriptionMapping); |
| 217 | + |
| 218 | + $this->assertHandlerDescriptor($container, $handlerDescriptionMapping, DummyMessage::class, [TaggedDummyHandlerWithUnionTypes::class], [[]]); |
| 219 | + $this->assertHandlerDescriptor($container, $handlerDescriptionMapping, SecondMessage::class, [TaggedDummyHandlerWithUnionTypes::class], [[]]); |
| 220 | + $this->assertHandlerDescriptor( |
| 221 | + $container, |
| 222 | + $handlerDescriptionMapping, |
| 223 | + UnionTypeOneMessage::class, |
| 224 | + [[TaggedDummyHandlerWithUnionTypes::class, 'handleUnionTypeMessage']] |
| 225 | + ); |
| 226 | + $this->assertHandlerDescriptor( |
| 227 | + $container, |
| 228 | + $handlerDescriptionMapping, |
| 229 | + UnionTypeTwoMessage::class, |
| 230 | + [[TaggedDummyHandlerWithUnionTypes::class, 'handleUnionTypeMessage']] |
| 231 | + ); |
| 232 | + } |
| 233 | + |
183 | 234 | public function testProcessHandlersByBus()
|
184 | 235 | {
|
185 | 236 | $container = $this->getContainerBuilder($commandBusId = 'command_bus');
|
|
0 commit comments