Aşağıdaki örnek veritabanı ile yaptığımız pre-update triggerleri gibi çalışır ve bir entity ile ilgili yapılan değişiklikleri, raporlama veya güvenlik amacıyla kayıt altına alır. Eğer bir kişi controller veya bir servis class içindeyken, herhangi bir alandaki bilgiyi X'den Y'ye çevirdiği zaman, aşağıdaki event listener bu yapılan değişikliği kayıt altına alır.


Listeners.yml


services:
application_backend.event_listener.user_entity_audit:
class: Application\BackendBundle\EventListener\UserEntityAuditListener
arguments: [ @security.context ]
tags:
- { name: doctrine.event_listener, event: preUpdate }
- { name: doctrine.event_listener, event: postFlush }

UserEntityAuditListener


namespace Application\BackendBundle\EventListener;

use Application\BackendBundle\Entity\User;
use Application\BackendBundle\Entity\UserAudit;
use Doctrine\ORM\Event\PostFlushEventArgs;
use Doctrine\ORM\Event\PreUpdateEventArgs;
use Symfony\Component\Security\Core\SecurityContextInterface;

class UserEntityAuditListener
{
private $securityContext;
private $fields = ['username', 'password'];
private $audit = [];

public function __construct(SecurityContextInterface $securityContextInterface)
{
$this->securityContext = $securityContextInterface;
}

public function preUpdate(PreUpdateEventArgs $args) // OR LifecycleEventArgs
{
$entity = $args->getEntity();

if ($entity instanceof User) {
foreach ($this->fields as $field) {
if ($args->getOldValue($field) != $args->getNewValue($field)) {
$audit = new UserAudit();
$audit->setField($field);
$audit->setOld($args->getOldValue($field));
$audit->setNew($args->getNewValue($field));
$audit->setUser($this->securityContext->getToken()->getUsername());

$this->audit[] = $audit;
}
}
}
}

public function postFlush(PostFlushEventArgs $args)
{
if (! empty($this->audit)) {
$em = $args->getEntityManager();

foreach ($this->audit as $audit) {
$em->persist($audit);
}

$this->audit = [];
$em->flush();
}
}
}