Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion DependencyInjection/Compiler/SubscriberPass.php
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}

Expand Down
4 changes: 4 additions & 0 deletions Listener/LogEventsListener.php
Original file line number Diff line number Diff line change
Expand Up @@ -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
{
Expand All @@ -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);
}
Expand Down
3 changes: 3 additions & 0 deletions Resources/config/services.yml
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@

services:


xiidea.easy_audit.logger_factory:
class: Xiidea\EasyAuditBundle\Logger\LoggerFactory
public: false
Expand All @@ -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
Expand Down
29 changes: 27 additions & 2 deletions Resources/doc/embed-resolver.md
Original file line number Diff line number Diff line change
@@ -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
<?php
Expand Down Expand Up @@ -30,6 +32,29 @@ class MyEvent extends Event implements EmbeddedEventResolverInterface
'type'=>$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));
```
27 changes: 27 additions & 0 deletions Tests/Functional/CommonTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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
Expand Down