Skip to content

Instantly share code, notes, and snippets.

@axelvnk
Created August 29, 2018 07:26
Show Gist options
  • Save axelvnk/4d162d7eef2d928b7fec3cc37b5aa875 to your computer and use it in GitHub Desktop.
Save axelvnk/4d162d7eef2d928b7fec3cc37b5aa875 to your computer and use it in GitHub Desktop.
Entitylistener that dispatches custom events for each entity operation
<?php
namespace Axelvnk\CustomEntityEventBundle\EventListener;
use Doctrine\Common\EventSubscriber;
use Doctrine\ORM\Event\LifecycleEventArgs;
use Doctrine\ORM\Event\PreUpdateEventArgs;
use Doctrine\ORM\Events;
use Symfony\Component\EventDispatcher\EventDispatcherInterface;
use Symfony\Component\EventDispatcher\GenericEvent;
use Symfony\Component\Serializer\NameConverter\CamelCaseToSnakeCaseNameConverter;
class EntityListener implements EventSubscriber
{
/**
* @var EventDispatcherInterface
*/
protected $eventDispatcher;
/**
* @var CamelCaseToSnakeCaseNameConverter
*/
protected $converter;
public function __construct(EventDispatcherInterface $eventDispatcher)
{
$this->eventDispatcher = $eventDispatcher;
$this->converter = new CamelCaseToSnakeCaseNameConverter();
}
protected function getEventName(string $className, string $event): string
{
$className = str_replace(['Entity\\', 'Bundle', '\\'], ['', '', '.'], $className);
$eventName = $this->converter->normalize($className) . '.' . $event;
return str_replace('._', '.', $eventName);
}
public function getSubscribedEvents(): array
{
return [
Events::preRemove,
Events::postRemove,
Events::preUpdate,
Events::postUpdate,
Events::prePersist,
Events::postPersist,
];
}
public function preRemove(LifecycleEventArgs $args): void
{
$this->eventDispatcher->dispatch($this->getEventName(get_class($args->getEntity()), 'pre_remove'), new GenericEvent($args));
}
public function postRemove(LifecycleEventArgs $args): void
{
$this->eventDispatcher->dispatch($this->getEventName(get_class($args->getEntity()), 'post_remove'), new GenericEvent($args));
}
public function preUpdate(PreUpdateEventArgs $args): void
{
$this->eventDispatcher->dispatch($this->getEventName(get_class($args->getEntity()), 'pre_update'), new GenericEvent($args));
}
public function postUpdate(LifecycleEventArgs $args): void
{
$this->eventDispatcher->dispatch($this->getEventName(get_class($args->getEntity()), 'post_update'), new GenericEvent($args));
}
public function prePersist(LifecycleEventArgs $args): void
{
$this->eventDispatcher->dispatch($this->getEventName(get_class($args->getEntity()), 'pre_persist'), new GenericEvent($args));
}
public function postPersist(LifecycleEventArgs $args): void
{
$this->eventDispatcher->dispatch($this->getEventName(get_class($args->getEntity()), 'post_persist'), new GenericEvent($args));
}
}
services:
axelvnk.custom_entity_event_listener:
class: Axelvnk\CustomEntityEventBundle\EventListener\EntityListener
arguments:
- "@event_dispatcher"
tags:
- { name: doctrine.event_listener, event: preRemove }
- { name: doctrine.event_listener, event: postRemove }
- { name: doctrine.event_listener, event: preUpdate }
- { name: doctrine.event_listener, event: postUpdate }
- { name: doctrine.event_listener, event: prePersist }
- { name: doctrine.event_listener, event: postPersist }
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment