Symfony2 – Ouvir eventos do Doctrine

Neste ProTip vou mostrar como ouvir eventos do Doctrine para que você possa acompanhar sempre que seu aplicativo interage com o banco de dados. Pode ser útil se você deseja criar um fluxo de trabalho de log personalizado.

Em primeiro lugar, vamos registrar um serviço. Adicione o seguinte exemplo a services.yml do seu pacote. (Vendor / ExampleBundle / Resources / config / services.yml) Neste exemplo, enviarei 2 eventos.

# Listen Doctrine events
vendor
.example_bundle.listener.doctrine:
class: VendorExampleBundleServiceDoctrineListenerService
arguments
: ['@service_container']
tags
:
- { name: doctrine.event_listener, event: postUpdate }
- { name: doctrine.event_listener, event: postPersist }

E agora estamos criando a classe de ouvinte

namespace VendorExampleBundleService;

use DoctrineCommonEventSubscriber;
use DoctrineORMEventLifecycleEventArgs;
use SymfonyComponentDependencyInjectionContainerInterface;

class DoctrineListenerService implements EventSubscriber
{

protected $container;

public function __construct(ContainerInterface $container)
{
$this
->container = $container;
}

public function getSubscribedEvents()
{
return array(
'postPersist',
'postUpdate',
);
}

/**
* This method will called on Doctrine postPersist event

*/

public function postPersist(LifecycleEventArgs $args)
{
# Avoid to log the logging process
if (!$args->getEntity() instanceof Log)
# Handle the log creation
$this
->createLog($args, 'persist');
}

/**
* This method will called on Doctrine postUpdate event

*/

public function postUpdate(LifecycleEventArgs $args)
{
# Handle the log creation
$this
->createLog($args, 'update');
}

/**
* Handle the log creation

*/

public function createLog(LifecycleEventArgs $args, $action)
{
# Entity manager
$em
= $args->getEntityManager();
$entity
= $args->getEntity();

# Set DateTime()
$dateTime
= new DateTime();

# Get user
if (method_exists($this->container->get('security.context'), 'getUser')):

# Get current user
$user
= $this->container->get('security.context')->getToken()->getUser();

# ... Do some logging action

endif
;
}

}

Aqui estão os eventos que você também pode enviar

  • prePersist
  • preRemove
  • preFlush
  • onFlush
  • postFlush
  • preUpdate
  • postUpdate
  • postRemove
  • postPersist
  • postLoad