From 761b478e02d49f180811c34233441813119dd7a6 Mon Sep 17 00:00:00 2001 From: Robiul Hasan Nowshad Date: Sat, 21 Mar 2026 21:21:02 +0600 Subject: [PATCH 1/2] feat(subscriber): auto-register EmbeddedEventResolverInterface event classes as listeners --- .../Compiler/SubscriberPass.php | 21 +++++ .../XiideaEasyAuditExtension.php | 4 + .../Compiler/SubscriberPassTest.php | 90 ++++++++++++++++--- .../XiideaEasyAuditExtensionTest.php | 11 +++ 4 files changed, 115 insertions(+), 11 deletions(-) diff --git a/DependencyInjection/Compiler/SubscriberPass.php b/DependencyInjection/Compiler/SubscriberPass.php index 8c30dfa..dc06d26 100644 --- a/DependencyInjection/Compiler/SubscriberPass.php +++ b/DependencyInjection/Compiler/SubscriberPass.php @@ -33,6 +33,7 @@ private function initializeSubscriberEvents(ContainerBuilder $container) $this->appendDoctrineEventsToList($container, $eventsList); $this->appendSubscribedEventsToList($container, $eventsList); + $this->appendEmbeddedEventClasses($container, $eventsList); $this->registerEventsToListener($eventsList, $container); } @@ -147,6 +148,26 @@ private function appendEventWithResolver(&$events, $items, $key) } } + /** + * @param ContainerBuilder $container + * @param array $events + */ + private function appendEmbeddedEventClasses(ContainerBuilder $container, array &$events = []): void + { + $taggedServices = $container->findTaggedServiceIds('easy_audit.embedded_event'); + + if (empty($taggedServices)) { + return; + } + + foreach ($taggedServices as $id => $_) { + $class = $container->getDefinition($id)->getClass(); + if ($class !== null) { + $events[] = $class; + } + } + } + /** * @param $events * @param ContainerBuilder $container diff --git a/DependencyInjection/XiideaEasyAuditExtension.php b/DependencyInjection/XiideaEasyAuditExtension.php index 1ec9bf9..beb5cb9 100644 --- a/DependencyInjection/XiideaEasyAuditExtension.php +++ b/DependencyInjection/XiideaEasyAuditExtension.php @@ -17,6 +17,7 @@ use Symfony\Component\DependencyInjection\Extension\PrependExtensionInterface; use Symfony\Component\DependencyInjection\Extension\Extension; use Symfony\Component\DependencyInjection\Loader; +use Xiidea\EasyAuditBundle\Resolver\EmbeddedEventResolverInterface; /** * This is the class that loads and manages your bundle configuration. @@ -38,6 +39,9 @@ public function load(array $configs, ContainerBuilder $container): void $container->setParameter('xiidea.easy_audit.' . $key, $value); } + $container->registerForAutoconfiguration(EmbeddedEventResolverInterface::class) + ->addTag('easy_audit.embedded_event'); + $loader = new Loader\YamlFileLoader($container, new FileLocator(__DIR__ . '/../Resources/config')); $loader->load('services.yml'); diff --git a/Tests/DependencyInjection/Compiler/SubscriberPassTest.php b/Tests/DependencyInjection/Compiler/SubscriberPassTest.php index e021bf4..91b2a2f 100644 --- a/Tests/DependencyInjection/Compiler/SubscriberPassTest.php +++ b/Tests/DependencyInjection/Compiler/SubscriberPassTest.php @@ -15,6 +15,7 @@ use Xiidea\EasyAuditBundle\DependencyInjection\Compiler\SubscriberPass; use Xiidea\EasyAuditBundle\Tests\Fixtures\Common\EasySubscriberOne; use Xiidea\EasyAuditBundle\Tests\Fixtures\Common\EasySubscriberTwo; +use Xiidea\EasyAuditBundle\Tests\Fixtures\Event\WithEmbeddedResolver; class SubscriberPassTest extends TestCase { @@ -48,10 +49,12 @@ public function testDisableDoctrineEvents() ['xiidea.easy_audit.doctrine_objects', false], ]); - $containerBuilder->expects($this->once()) + $containerBuilder->expects($this->exactly(2)) ->method('findTaggedServiceIds') - ->with($this->equalTo('easy_audit.event_subscriber')) - ->will($this->returnValue([])); + ->willReturnMap([ + ['easy_audit.event_subscriber', false, []], + ['easy_audit.embedded_event', false, []], + ]); $this->processSubscriberPass($containerBuilder); } @@ -117,8 +120,10 @@ public function testSubscribedEventsWithDisableDoctrineEvents() $containerBuilder ->method('findTaggedServiceIds') - ->with($this->equalTo('easy_audit.event_subscriber')) - ->will($this->returnValue($subscribers)); + ->willReturnMap([ + ['easy_audit.event_subscriber', false, $subscribers], + ['easy_audit.embedded_event', false, []], + ]); $definitionMock = $this->getDefinitionMock(); @@ -214,8 +219,10 @@ public function testSubscribedEventsWithEnabledDoctrineEvents() $containerBuilder ->method('findTaggedServiceIds') - ->with($this->equalTo('easy_audit.event_subscriber')) - ->will($this->returnValue($subscribers)); + ->willReturnMap([ + ['easy_audit.event_subscriber', false, $subscribers], + ['easy_audit.embedded_event', false, []], + ]); $definitionMock = $this->getDefinitionMock(); @@ -293,6 +300,63 @@ public function testSubscribedEventsWithEnabledDoctrineEvents() $this->processSubscriberPass($containerBuilder); } + public function testEmbeddedEventClassesAreAutoRegistered() + { + $containerBuilder = $this->createMock('Symfony\Component\DependencyInjection\ContainerBuilder'); + + $containerBuilder->expects($this->any()) + ->method('hasDefinition') + ->with($this->equalTo('xiidea.easy_audit.event_listener')) + ->will($this->returnValue(true)); + + $containerBuilder->expects($this->any()) + ->method('getParameter') + ->willReturnMap([ + ['xiidea.easy_audit.events', []], + ['xiidea.easy_audit.doctrine_objects', false], + ['xiidea.easy_audit.custom_resolvers', []], + ]); + + $embeddedServiceId = WithEmbeddedResolver::class; + + $containerBuilder + ->method('findTaggedServiceIds') + ->willReturnMap([ + ['easy_audit.event_subscriber', false, []], + ['easy_audit.embedded_event', false, [$embeddedServiceId => []]], + ]); + + $embeddedDefinition = $this->getMockBuilder('Symfony\Component\DependencyInjection\Definition') + ->disableOriginalConstructor() + ->getMock(); + $embeddedDefinition->method('getClass')->willReturn($embeddedServiceId); + + $listenerDefinition = $this->getDefinitionMock(); + + $containerBuilder + ->method('getDefinition') + ->willReturnMap([ + ['xiidea.easy_audit.event_listener', $listenerDefinition], + [$embeddedServiceId, $embeddedDefinition], + ]); + + $expectedEvents = [ + ['event' => $embeddedServiceId, 'method' => 'resolveEventHandler'], + ]; + + $listenerDefinition + ->expects($this->once()) + ->method('setTags') + ->with($this->equalTo(['kernel.event_listener' => $expectedEvents])); + + $containerBuilder + ->expects($this->once()) + ->method('setParameter') + ->with($this->equalTo('xiidea.easy_audit.custom_resolvers'), []); + + $this->processSubscriberPass($containerBuilder); + } + /** * @return \PHPUnit_Framework_MockObject_MockObject */ @@ -366,8 +430,10 @@ protected function containerExpectsForEnabledDoctrineEvents($containerBuilder, $ $containerBuilder ->method('findTaggedServiceIds') - ->with($this->equalTo('easy_audit.event_subscriber')) - ->will($this->returnValue($subscribedEvents)); + ->willReturnMap([ + ['easy_audit.event_subscriber', false, $subscribedEvents], + ['easy_audit.embedded_event', false, []], + ]); $containerBuilder ->method('getDefinition') @@ -383,8 +449,10 @@ protected function containerExpectsForDisabledDoctrineEvents($containerBuilder, { $containerBuilder ->method('findTaggedServiceIds') - ->with($this->equalTo('easy_audit.event_subscriber')) - ->will($this->returnValue($subscribedEvents)); + ->willReturnMap([ + ['easy_audit.event_subscriber', false, $subscribedEvents], + ['easy_audit.embedded_event', false, []], + ]); } /** diff --git a/Tests/DependencyInjection/XiideaEasyAuditExtensionTest.php b/Tests/DependencyInjection/XiideaEasyAuditExtensionTest.php index 1b8d38f..a918da2 100644 --- a/Tests/DependencyInjection/XiideaEasyAuditExtensionTest.php +++ b/Tests/DependencyInjection/XiideaEasyAuditExtensionTest.php @@ -16,6 +16,7 @@ use Symfony\Component\DependencyInjection\ContainerBuilder; use Symfony\Component\Yaml\Parser; use Xiidea\EasyAuditBundle\DependencyInjection\XiideaEasyAuditExtension; +use Xiidea\EasyAuditBundle\Resolver\EmbeddedEventResolverInterface; class XiideaEasyAuditExtensionTest extends TestCase { @@ -62,6 +63,16 @@ public function testPrependEntityEventResolverValueOnlyIfDoctrineLoaded() $this->assertHasDefinition('xiidea.easy_audit.default_doctrine_event_resolver'); } + public function testEmbeddedEventResolverIsAutoconfigured() + { + $loader = new XiideaEasyAuditExtension(); + $loader->load([$this->getRequiredConfig()], $this->container); + + $autoconfigured = $this->container->getAutoconfiguredInstanceof(); + $this->assertArrayHasKey(EmbeddedEventResolverInterface::class, $autoconfigured); + $this->assertTrue($autoconfigured[EmbeddedEventResolverInterface::class]->hasTag('easy_audit.embedded_event')); + } + public function testEasyAuditLoadThrowsExceptionUnlessEntityClassSet() { $loader = new XiideaEasyAuditExtension(); From d5d8d1318aa4ec7505e3f36901056dff08e217c2 Mon Sep 17 00:00:00 2001 From: Robiul Hasan Nowshad Date: Mon, 23 Mar 2026 21:53:23 +0600 Subject: [PATCH 2/2] refactor(embedded-event): use typed event dispatch via interface FQCN --- .../Compiler/SubscriberPass.php | 24 +---- .../XiideaEasyAuditExtension.php | 4 - Listener/LogEventsListener.php | 4 + Resources/config/services.yml | 3 + Resources/doc/embed-resolver.md | 29 +++++- .../Compiler/SubscriberPassTest.php | 90 +++---------------- .../XiideaEasyAuditExtensionTest.php | 11 --- Tests/Functional/CommonTest.php | 27 ++++++ 8 files changed, 74 insertions(+), 118 deletions(-) diff --git a/DependencyInjection/Compiler/SubscriberPass.php b/DependencyInjection/Compiler/SubscriberPass.php index dc06d26..d65075b 100644 --- a/DependencyInjection/Compiler/SubscriberPass.php +++ b/DependencyInjection/Compiler/SubscriberPass.php @@ -33,7 +33,6 @@ private function initializeSubscriberEvents(ContainerBuilder $container) $this->appendDoctrineEventsToList($container, $eventsList); $this->appendSubscribedEventsToList($container, $eventsList); - $this->appendEmbeddedEventClasses($container, $eventsList); $this->registerEventsToListener($eventsList, $container); } @@ -148,26 +147,6 @@ private function appendEventWithResolver(&$events, $items, $key) } } - /** - * @param ContainerBuilder $container - * @param array $events - */ - private function appendEmbeddedEventClasses(ContainerBuilder $container, array &$events = []): void - { - $taggedServices = $container->findTaggedServiceIds('easy_audit.embedded_event'); - - if (empty($taggedServices)) { - return; - } - - foreach ($taggedServices as $id => $_) { - $class = $container->getDefinition($id)->getClass(); - if ($class !== null) { - $events[] = $class; - } - } - } - /** * @param $events * @param ContainerBuilder $container @@ -181,10 +160,11 @@ private function registerEventsToListener($events, ContainerBuilder $container) $definition = $container->getDefinition('xiidea.easy_audit.event_listener'); $customResolvers = $container->getParameter('xiidea.easy_audit.custom_resolvers'); + $existingTags = $definition->getTag('kernel.event_listener'); $listenableEventsList = $this->getListenableEventList($events); $this->buildCustomResolverList($events, $customResolvers); - $definition->setTags(array('kernel.event_listener' => array_values($listenableEventsList))); + $definition->setTags(array('kernel.event_listener' => array_merge($existingTags, array_values($listenableEventsList)))); $container->setParameter('xiidea.easy_audit.custom_resolvers', $customResolvers); } diff --git a/DependencyInjection/XiideaEasyAuditExtension.php b/DependencyInjection/XiideaEasyAuditExtension.php index beb5cb9..1ec9bf9 100644 --- a/DependencyInjection/XiideaEasyAuditExtension.php +++ b/DependencyInjection/XiideaEasyAuditExtension.php @@ -17,7 +17,6 @@ use Symfony\Component\DependencyInjection\Extension\PrependExtensionInterface; use Symfony\Component\DependencyInjection\Extension\Extension; use Symfony\Component\DependencyInjection\Loader; -use Xiidea\EasyAuditBundle\Resolver\EmbeddedEventResolverInterface; /** * This is the class that loads and manages your bundle configuration. @@ -39,9 +38,6 @@ public function load(array $configs, ContainerBuilder $container): void $container->setParameter('xiidea.easy_audit.' . $key, $value); } - $container->registerForAutoconfiguration(EmbeddedEventResolverInterface::class) - ->addTag('easy_audit.embedded_event'); - $loader = new Loader\YamlFileLoader($container, new FileLocator(__DIR__ . '/../Resources/config')); $loader->load('services.yml'); diff --git a/Listener/LogEventsListener.php b/Listener/LogEventsListener.php index daf5450..234d58d 100644 --- a/Listener/LogEventsListener.php +++ b/Listener/LogEventsListener.php @@ -14,6 +14,7 @@ use Symfony\Contracts\EventDispatcher\Event; use Xiidea\EasyAuditBundle\Logger\LoggerFactory; use Xiidea\EasyAuditBundle\Resolver\EventResolverFactory; +use Xiidea\EasyAuditBundle\Resolver\EmbeddedEventResolverInterface; class LogEventsListener { @@ -23,6 +24,9 @@ public function __construct(private LoggerFactory $loggerFactory, private EventR public function resolveEventHandler(Event $event, $eventName) { + if ($event instanceof EmbeddedEventResolverInterface && $eventName === EmbeddedEventResolverInterface::class) { + $eventName = get_class($event); + } $eventInfo = $this->resolverFactory->getEventLog($event, $eventName); $this->loggerFactory->executeLoggers($eventInfo); } diff --git a/Resources/config/services.yml b/Resources/config/services.yml index 09a6f0f..10eb6c7 100644 --- a/Resources/config/services.yml +++ b/Resources/config/services.yml @@ -1,6 +1,7 @@ services: + xiidea.easy_audit.logger_factory: class: Xiidea\EasyAuditBundle\Logger\LoggerFactory public: false @@ -21,6 +22,8 @@ services: xiidea.easy_audit.event_listener: class: Xiidea\EasyAuditBundle\Listener\LogEventsListener arguments: ['@xiidea.easy_audit.logger_factory', '@xiidea.easy_audit.event_resolver_factory'] + tags: + - { name: kernel.event_listener, event: 'Xiidea\EasyAuditBundle\Resolver\EmbeddedEventResolverInterface', method: resolveEventHandler } xiidea.easy_audit.mono_logger.service: class: Xiidea\EasyAuditBundle\Logger\MonologLogger diff --git a/Resources/doc/embed-resolver.md b/Resources/doc/embed-resolver.md index 3770772..138ea8b 100644 --- a/Resources/doc/embed-resolver.md +++ b/Resources/doc/embed-resolver.md @@ -1,6 +1,8 @@ # Embed Resolver with event -Sometime it is easy if you could embed your resolver with your event itself. Easy audit also support such implementation. What you need to do just write your event class implementing `Xiidea\EasyAuditBundle\Resolver\EmbeddedEventResolverInterface` +Sometimes it is easier to embed the resolver logic directly in your event class. EasyAuditBundle supports this via `EmbeddedEventResolverInterface`. Two approaches are available depending on how you prefer to register and dispatch your events. + +## Write your event class ```php $eventName ); } - } ``` + +--- + +## Approach 1: Interface-Based Dispatch Shortcut + +Dispatch using the interface FQCN as the event name. No subscriber or extra configuration is needed. + +```php +use Xiidea\EasyAuditBundle\Resolver\EmbeddedEventResolverInterface; + +$dispatcher->dispatch(new MyEvent($data), EmbeddedEventResolverInterface::class); +``` + +The audit log `type` will be set to the concrete class name (`MyEvent`), not the interface name. + +--- + +## Approach 2: Subscriber-Based Registration + +If you prefer Symfony's more typical class-based event registration, add `MyEvent::class` to your subscriber. See [subscriber.md](subscriber.md) for details. + +```php +$dispatcher->dispatch(new MyEvent($data)); +``` diff --git a/Tests/DependencyInjection/Compiler/SubscriberPassTest.php b/Tests/DependencyInjection/Compiler/SubscriberPassTest.php index 91b2a2f..e021bf4 100644 --- a/Tests/DependencyInjection/Compiler/SubscriberPassTest.php +++ b/Tests/DependencyInjection/Compiler/SubscriberPassTest.php @@ -15,7 +15,6 @@ use Xiidea\EasyAuditBundle\DependencyInjection\Compiler\SubscriberPass; use Xiidea\EasyAuditBundle\Tests\Fixtures\Common\EasySubscriberOne; use Xiidea\EasyAuditBundle\Tests\Fixtures\Common\EasySubscriberTwo; -use Xiidea\EasyAuditBundle\Tests\Fixtures\Event\WithEmbeddedResolver; class SubscriberPassTest extends TestCase { @@ -49,12 +48,10 @@ public function testDisableDoctrineEvents() ['xiidea.easy_audit.doctrine_objects', false], ]); - $containerBuilder->expects($this->exactly(2)) + $containerBuilder->expects($this->once()) ->method('findTaggedServiceIds') - ->willReturnMap([ - ['easy_audit.event_subscriber', false, []], - ['easy_audit.embedded_event', false, []], - ]); + ->with($this->equalTo('easy_audit.event_subscriber')) + ->will($this->returnValue([])); $this->processSubscriberPass($containerBuilder); } @@ -120,10 +117,8 @@ public function testSubscribedEventsWithDisableDoctrineEvents() $containerBuilder ->method('findTaggedServiceIds') - ->willReturnMap([ - ['easy_audit.event_subscriber', false, $subscribers], - ['easy_audit.embedded_event', false, []], - ]); + ->with($this->equalTo('easy_audit.event_subscriber')) + ->will($this->returnValue($subscribers)); $definitionMock = $this->getDefinitionMock(); @@ -219,10 +214,8 @@ public function testSubscribedEventsWithEnabledDoctrineEvents() $containerBuilder ->method('findTaggedServiceIds') - ->willReturnMap([ - ['easy_audit.event_subscriber', false, $subscribers], - ['easy_audit.embedded_event', false, []], - ]); + ->with($this->equalTo('easy_audit.event_subscriber')) + ->will($this->returnValue($subscribers)); $definitionMock = $this->getDefinitionMock(); @@ -300,63 +293,6 @@ public function testSubscribedEventsWithEnabledDoctrineEvents() $this->processSubscriberPass($containerBuilder); } - public function testEmbeddedEventClassesAreAutoRegistered() - { - $containerBuilder = $this->createMock('Symfony\Component\DependencyInjection\ContainerBuilder'); - - $containerBuilder->expects($this->any()) - ->method('hasDefinition') - ->with($this->equalTo('xiidea.easy_audit.event_listener')) - ->will($this->returnValue(true)); - - $containerBuilder->expects($this->any()) - ->method('getParameter') - ->willReturnMap([ - ['xiidea.easy_audit.events', []], - ['xiidea.easy_audit.doctrine_objects', false], - ['xiidea.easy_audit.custom_resolvers', []], - ]); - - $embeddedServiceId = WithEmbeddedResolver::class; - - $containerBuilder - ->method('findTaggedServiceIds') - ->willReturnMap([ - ['easy_audit.event_subscriber', false, []], - ['easy_audit.embedded_event', false, [$embeddedServiceId => []]], - ]); - - $embeddedDefinition = $this->getMockBuilder('Symfony\Component\DependencyInjection\Definition') - ->disableOriginalConstructor() - ->getMock(); - $embeddedDefinition->method('getClass')->willReturn($embeddedServiceId); - - $listenerDefinition = $this->getDefinitionMock(); - - $containerBuilder - ->method('getDefinition') - ->willReturnMap([ - ['xiidea.easy_audit.event_listener', $listenerDefinition], - [$embeddedServiceId, $embeddedDefinition], - ]); - - $expectedEvents = [ - ['event' => $embeddedServiceId, 'method' => 'resolveEventHandler'], - ]; - - $listenerDefinition - ->expects($this->once()) - ->method('setTags') - ->with($this->equalTo(['kernel.event_listener' => $expectedEvents])); - - $containerBuilder - ->expects($this->once()) - ->method('setParameter') - ->with($this->equalTo('xiidea.easy_audit.custom_resolvers'), []); - - $this->processSubscriberPass($containerBuilder); - } - /** * @return \PHPUnit_Framework_MockObject_MockObject */ @@ -430,10 +366,8 @@ protected function containerExpectsForEnabledDoctrineEvents($containerBuilder, $ $containerBuilder ->method('findTaggedServiceIds') - ->willReturnMap([ - ['easy_audit.event_subscriber', false, $subscribedEvents], - ['easy_audit.embedded_event', false, []], - ]); + ->with($this->equalTo('easy_audit.event_subscriber')) + ->will($this->returnValue($subscribedEvents)); $containerBuilder ->method('getDefinition') @@ -449,10 +383,8 @@ protected function containerExpectsForDisabledDoctrineEvents($containerBuilder, { $containerBuilder ->method('findTaggedServiceIds') - ->willReturnMap([ - ['easy_audit.event_subscriber', false, $subscribedEvents], - ['easy_audit.embedded_event', false, []], - ]); + ->with($this->equalTo('easy_audit.event_subscriber')) + ->will($this->returnValue($subscribedEvents)); } /** diff --git a/Tests/DependencyInjection/XiideaEasyAuditExtensionTest.php b/Tests/DependencyInjection/XiideaEasyAuditExtensionTest.php index a918da2..1b8d38f 100644 --- a/Tests/DependencyInjection/XiideaEasyAuditExtensionTest.php +++ b/Tests/DependencyInjection/XiideaEasyAuditExtensionTest.php @@ -16,7 +16,6 @@ use Symfony\Component\DependencyInjection\ContainerBuilder; use Symfony\Component\Yaml\Parser; use Xiidea\EasyAuditBundle\DependencyInjection\XiideaEasyAuditExtension; -use Xiidea\EasyAuditBundle\Resolver\EmbeddedEventResolverInterface; class XiideaEasyAuditExtensionTest extends TestCase { @@ -63,16 +62,6 @@ public function testPrependEntityEventResolverValueOnlyIfDoctrineLoaded() $this->assertHasDefinition('xiidea.easy_audit.default_doctrine_event_resolver'); } - public function testEmbeddedEventResolverIsAutoconfigured() - { - $loader = new XiideaEasyAuditExtension(); - $loader->load([$this->getRequiredConfig()], $this->container); - - $autoconfigured = $this->container->getAutoconfiguredInstanceof(); - $this->assertArrayHasKey(EmbeddedEventResolverInterface::class, $autoconfigured); - $this->assertTrue($autoconfigured[EmbeddedEventResolverInterface::class]->hasTag('easy_audit.embedded_event')); - } - public function testEasyAuditLoadThrowsExceptionUnlessEntityClassSet() { $loader = new XiideaEasyAuditExtension(); diff --git a/Tests/Functional/CommonTest.php b/Tests/Functional/CommonTest.php index 66893aa..c097eac 100644 --- a/Tests/Functional/CommonTest.php +++ b/Tests/Functional/CommonTest.php @@ -13,6 +13,7 @@ use Symfony\Component\DomCrawler\Crawler; use Xiidea\EasyAuditBundle\Model\BaseAuditLog; +use Xiidea\EasyAuditBundle\Resolver\EmbeddedEventResolverInterface; use Xiidea\EasyAuditBundle\Tests\Fixtures\Event\Basic; use Xiidea\EasyAuditBundle\Tests\Fixtures\Event\WithEmbeddedResolver; use Xiidea\EasyAuditBundle\Tests\Functional\Bundle\TestBundle\Controller\DefaultController; @@ -95,6 +96,32 @@ public function testMultipleChannel() $this->assertEquals('By Command', $event2['user']); $this->assertEquals('', $event2['ip']); } + /** + * @runInSeparateProcess + * @preserveGlobalState disabled + */ + public function testEmbeddedEventInterfaceDispatch() + { + $kernel = static::createKernel(); + $kernel->boot(); + + $container = $kernel->getContainer(); + + $container->get('event_dispatcher')->dispatch( + new WithEmbeddedResolver(), + EmbeddedEventResolverInterface::class + ); + + $logFile = realpath($container->getParameter('kernel.cache_dir') . '2' . DIRECTORY_SEPARATOR . 'audit.log'); + $event = unserialize(file_get_contents($logFile)); + + $this->assertEquals(WithEmbeddedResolver::class, $event['typeId']); + $this->assertEquals(WithEmbeddedResolver::class, $event['type']); + $this->assertEquals('It is an embedded event', $event['description']); + $this->assertEquals('By Command', $event['user']); + $this->assertEquals('', $event['ip']); + } + /** * @runInSeparateProcess