em = $em; $this->token = $token; $this->params = $params; } public function getSubscribedEvents(): array { return [ Events::preRemove, Events::onFlush, ]; } public function preRemove(LifecycleEventArgs $args): void { $this->entity = $args->getObject(); // Les enregistrements négatifs sont des enregistrements systeme indispensable if ($this->entity->getId() < 0) { throw new \Exception("Impossible de supprimer cet enregistrement. C'est un enregistrement système"); } } public function onFlush(OnFlushEventArgs $eventArgs): void { $this->entity = $eventArgs->getEntityManager(); if ($this->entity instanceof Audit || !$this->params->get('auditUse')) { return; } $this->audit(); } private function audit() { $token = $this->token->getToken(); if (!$token) { $user = 'job'; } else { $user = $token->getUser(); if ('anon.' != $user) { $user = $user->getUsername(); } else { $user = 'job'; } } $uow = $this->em->getUnitOfWork(); $uow->computeChangeSets(); foreach ($uow->getScheduledEntityInsertions() as $entity) { $metaCar = $this->em->getClassMetadata(get_class($entity)); $className = str_replace('App\\Entity\\', '', $metaCar->getName()); $nameold = ''; if ($metaCar->hasField('name')) { $nameold = ' = '.$entity->getName(); } elseif ($metaCar->hasField('label')) { $nameold = ' = '.$entity->getLabel(); } elseif ($metaCar->hasField('username')) { $nameold = ' = '.$entity->getUsername(); } $audit = new Audit(); $audit->setDatesubmit(new \DateTime('now')); $audit->setEntityname($className); $audit->setEntityid($entity->getId()); $audit->setUsername($user); $audit->setDescription('SUBMIT'); $audit->setDetail(['id' => $entity->getId().$nameold]); $this->em->persist($audit); $uow->computeChangeSet($this->em->getClassMetadata(get_class($audit)), $audit); } foreach ($uow->getScheduledEntityDeletions() as $entity) { $metaCar = $this->em->getClassMetadata(get_class($entity)); $className = str_replace('App\\Entity\\', '', $metaCar->getName()); $nameold = ''; if ($metaCar->hasField('name')) { $nameold = ' = '.$entity->getName(); } elseif ($metaCar->hasField('label')) { $nameold = ' = '.$entity->getLabel(); } elseif ($metaCar->hasField('username')) { $nameold = ' = '.$entity->getUsername(); } $audit = new Audit(); $audit->setDatesubmit(new \DateTime('now')); $audit->setEntityname($className); $audit->setEntityid($entity->getId()); $audit->setUsername($user); $audit->setDescription('DELETE'); $audit->setDetail(['id' => $entity->getId().$nameold]); $this->em->persist($audit); $uow->computeChangeSet($this->em->getClassMetadata(get_class($audit)), $audit); } foreach ($uow->getScheduledEntityUpdates() as $entity) { $changeSet = $uow->getEntityChangeSet($entity); // Unaudit field $className = str_replace('App\\Entity\\', '', $this->em->getClassMetadata(get_class($entity))->getName()); switch ($className) { case 'Audit': $changeSet = null; break; case 'User': unset($changeSet['visitecpt']); unset($changeSet['visitedate']); unset($changeSet['preference']); unset($changeSet['keyvalue']); unset($changeSet['keyexpire']); unset($changeSet['apikey']); unset($changeSet['password']); unset($changeSet['passwordplain']); unset($changeSet['salt']); break; default: unset($changeSet['apikey']); break; } if ($changeSet) { $mychange = []; foreach ($changeSet as $key => $value) { // Le champs modifié est-il une entité $isentity0 = ($value[0] && is_object($value[0]) && get_class($value[0]) && 'DateTime' != get_class($value[0])); $isentity1 = ($value[1] && is_object($value[1]) && get_class($value[1]) && 'DateTime' != get_class($value[1])); if ($isentity0 || $isentity1) { $nameold = ''; if ($isentity0) { $metaCar = $this->em->getClassMetadata(get_class($value[0])); if ($metaCar->hasField('name')) { $nameold = ' = '.$value[0]->getName(); } elseif ($metaCar->hasField('label')) { $nameold = ' = '.$value[0]->getLabel(); } elseif ($metaCar->hasField('username')) { $nameold = ' = '.$value[0]->getUsername(); } $nameold = $value[0]->getId().$nameold; } $namenew = ''; if ($isentity1) { $metaCar = $this->em->getClassMetadata(get_class($value[1])); if ($metaCar->hasField('name')) { $namenew = ' = '.$value[1]->getName(); } elseif ($metaCar->hasField('label')) { $namenew = ' = '.$value[1]->getLabel(); } elseif ($metaCar->hasField('username')) { $namenew = ' = '.$value[1]->getUsername(); } $namenew = $value[1]->getId().$namenew; } $mychange[$key] = [$nameold, $namenew]; } else { $mychange[$key] = $value; } } $audit = new Audit(); $audit->setDatesubmit(new \DateTime('now')); $audit->setEntityname($className); $audit->setEntityid($entity->getId()); $audit->setUsername($user); $audit->setDescription('UPDATE'); $audit->setDetail($mychange); $this->em->persist($audit); $uow->computeChangeSet($this->em->getClassMetadata(get_class($audit)), $audit); } } } }