/** * Create a new AuditEntry and add a log entry to it if the log is set * * @param EntityManager $em * @param $entity * @param $type * @param null $field * @param null $oldVal * @param null $newVal */ protected function createAudit(EntityManager $em, $entity, $type, $field = NULL, $oldVal = NULL, $newVal = NULL) { $changeDate = new \DateTime("now"); $audit = new AuditEntry(get_class($entity), $entity->getId(), $type, $changeDate, $field, $oldVal, $newVal); if ($this->log) { $audit->addLog($this->log); } $em->persist($audit); $em->getUnitOfWork()->computeChangeSet($em->getClassMetadata(get_class($audit)), $audit); }
/** * If Auditable entity is newly persisted then add an insert entry into the AuditEntry * Mark to be flushed if any audits added * @param LifecycleEventArgs $args */ public function postPersist(LifecycleEventArgs $args) { $entity = $args->getEntity(); $em = $args->getEntityManager(); if ($entity instanceof Auditable) { $changeDate = new \DateTime("now"); $audit = new AuditEntry(get_class($entity), $entity->getId(), 'INSERT', $changeDate); if ($this->log) { $audit->addLog($this->log); } $em->persist($audit); $this->needsFlush = true; } }
public function revertAudit(AuditEntry $audit) { $entity = $this->em->getRepository($audit->getResourceName())->find($audit->getResourceId()); $getter = 'get' . ucfirst($audit->getFieldName()); $setter = 'set' . ucfirst($audit->getFieldName()); $entityValue = $entity->{$getter}(); if (!is_object($entityValue)) { if ($audit->getNewValue() == $entityValue) { $entity->{$setter}($audit->getOldValue()); } else { throw EntityInWrongStateException; } } elseif (!$entityValue instanceof Collection) { $oldValue = $this->getEntityRepository($entityValue)->find($audit->getOldValue()); $newValue = $this->getEntityRepository($entityValue)->find($audit->getNewValue()); if ($newValue === $entityValue) { $entity->{$setter}($oldValue); } else { throw EntityInWrongStateException; } } else { } }