O que são eventos de ciclo de vida do Doctrine no Symfony?
O Doctrine é um ORM (Object-Relational Mapper) que permite mapear objetos da sua aplicação em tabelas do banco de dados relacional. Quando utilizamos o Doctrine no Symfony, é possível definir eventos que são disparados em determinados momentos do ciclo de vida do banco de dados, como antes ou depois de uma entidade ser persistida, atualizada ou removida, por exemplo. Esses eventos permitem manipular dados e executar ações personalizadas de acordo com as necessidades da aplicação.
Qual é a estrutura básica de um evento de ciclo de vida do Doctrine?
Um evento de ciclo de vida do Doctrine é composto por duas partes: o listener e o evento em si.
O listener é uma classe que contém métodos que são executados antes ou depois de uma determinada ação no banco de dados. Por exemplo, um listener pode ser responsável por manipular os dados de uma entidade antes que ela seja persistida no banco ou por executar alguma ação após essa entidade ser removida.
O evento, por sua vez, é representado por uma classe que contém informações sobre a ação que está sendo realizada, como a entidade envolvida e a operação que está sendo executada (inserção, atualização ou remoção, por exemplo).
// Exemplo de listener para o evento "prePersist":
namespace AppBundleEventListener;
use DoctrineORMEventLifecycleEventArgs;
class CustomListener
{
public function prePersist(LifecycleEventArgs $args)
{
$entity = $args->getEntity();
...
}
}
Como registrar um listener de eventos de ciclo de vida do Doctrine no Symfony?
Para registrar um listener de eventos de ciclo de vida do Doctrine no Symfony, é necessário criar um serviço com a tag “doctrine.event_listener” ou “doctrine.event_subscriber”, dependendo do tipo de listener que estamos criando.
A tag “doctrine.event_listener” é utilizada quando queremos criar um listener com um ou mais métodos que respondem a eventos específicos. Por exemplo, uma classe que contém um método que responde ao evento “prePersist” pode ser definida como um listener da seguinte forma:
// Definição do serviço no arquivo services.yml:
app.listener.custom:
class: AppBundleEventListenerCustomListener
tags:
- { name: doctrine.event_listener, event: prePersist }
// Exemplo de um listener com um método que responde ao evento "prePersist":
namespace AppBundleEventListener;
use DoctrineORMEventLifecycleEventArgs;
class CustomListener
{
public function prePersist(LifecycleEventArgs $args)
{
$entity = $args->getEntity();
...
}
}
Já a tag “doctrine.event_subscriber” é utilizada quando queremos criar um listener que implementa a interface “EventSubscriber” e é capaz de responder a vários eventos. Por exemplo:
// Definição do serviço no arquivo services.yml:
app.subscriber.custom:
class: AppBundleSubscriberCustomSubscriber
tags:
- { name: doctrine.event_subscriber }
// Exemplo de um subscriber que implementa a interface "EventSubscriber":
namespace AppBundleSubscriber;
use DoctrineCommonEventSubscriber;
use DoctrineORMEventLifecycleEventArgs;
use DoctrineORMEvents;
class CustomSubscriber implements EventSubscriber
{
public function getSubscribedEvents()
{
return [
Events::prePersist,
Events::postPersist,
Events::preUpdate,
Events::postUpdate,
Events::preRemove,
Events::postRemove,
...
];
}
public function prePersist(LifecycleEventArgs $args)
{
$entity = $args->getEntity();
...
}
public function postPersist(LifecycleEventArgs $args)
{
$entity = $args->getEntity();
...
}
public function preUpdate(LifecycleEventArgs $args)
{
$entity = $args->getEntity();
...
}
public function postUpdate(LifecycleEventArgs $args)
{
$entity = $args->getEntity();
...
}
public function preRemove(LifecycleEventArgs $args)
{
$entity = $args->getEntity();
...
}
public function postRemove(LifecycleEventArgs $args)
{
$entity = $args->getEntity();
...
}
}