diff --git a/DependencyInjection/Compiler/SubscriberPass.php b/DependencyInjection/Compiler/SubscriberPass.php index 8c30dfa..d65075b 100644 --- a/DependencyInjection/Compiler/SubscriberPass.php +++ b/DependencyInjection/Compiler/SubscriberPass.php @@ -160,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/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/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