logger = $logger; } public function onFlush(OnFlushEventArgs $eventArgs) { $em = $eventArgs->getEntityManager(); $uow = $em->getUnitOfWork(); /* * Log changes and deletions of entites. * We can not log persist here, because the entities do not have IDs yet... */ foreach ($uow->getScheduledEntityUpdates() as $entity) { if ($this->validEntity($entity)) { $log = new ElementEditedLogEntry($entity); $this->logger->log($log); } } foreach ($uow->getScheduledEntityDeletions() as $entity) { if ($this->validEntity($entity)) { $log = new ElementDeletedLogEntry($entity); $this->logger->log($log); } } $uow->computeChangeSets(); } public function postPersist(LifecycleEventArgs $args) { //Create an log entry /** @var AbstractDBElement $entity */ $entity = $args->getObject(); if ($this->validEntity($entity)) { $log = new ElementCreatedLogEntry($entity); $this->logger->log($log); } } public function postFlush(PostFlushEventArgs $args) { $em = $args->getEntityManager(); $uow = $em->getUnitOfWork(); // If the we have added any ElementCreatedLogEntries added in postPersist, we flush them here. if ($uow->hasPendingInsertions()) { $em->flush(); } } /** * Check if the given entity can be logged. * @param object $entity * @return bool True, if the given entity can be logged. */ protected function validEntity(object $entity): bool { //Dont log logentries itself! if ($entity instanceof AbstractDBElement && !$entity instanceof AbstractLogEntry) { return true; } return false; } /** * @inheritDoc */ public function getSubscribedEvents() { return[ Events::onFlush, Events::postPersist, Events::postFlush ]; } }