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