Bonjour, je viens vers vous pour vous demandez un conseil sur une façon de faire des logs à l'aide de Symfony 3. Je vous explique ce que j'ai déjà de fonctionnel. J'utilise le service Monolog et des Listeners pour enregistrer les logs sur mes entités à l'aide des Listener suivant: postPersist, postUpdate ou preRemove. L'événement est ensuite appelé lors d'un persist, update ou remove et un service écrit dans un fichier de logs. Cependant ces logs sont enregistrés dans un fichier. Je souhaiterais les enregistrer en base de données. J'ai vu un tuto sur internet qui permettait de faire ça, si vous avez des idées ou des tutos je suis preneur. Je pense qu'au lieu d'écrire dans un fichier il suffit simplement de remplacer cette méthode pour écrire en base de données tout simplement.

Cependant, la difficulté est ici, je m'explique: je peux avoir parfois une entité mère qui possède des entités enfant, par exemple j'ai une voiture qui possède des roues. Ce qu'il se passe c'est que si par exemple je supprime une voiture, les roues vont être automatiquement supprimées, cependant dans mon fichier de logs je vais avoir deux lignes, une pour la suppression de la voiture, une pour les roues, ce que je souhaiterais c'est n'avoir qu'une seule ligne qui dit suppression de voiture, et qui inclut la suppression des roues. Voici un exemple de ce que j'ai au niveau des listeners :

public function postRemove(Equipement $equip, LifecycleEventArgs $event)
{
    $user = $this->tokenStorage->getToken()->getUser();
    $this->logDoctrine->createLog($event,'Delete',$user,array(), $this->container);
}

Ce listener n'a pas besoin d'être compris en totalité, juste c'est celui qui va être appelé lorsque l'on va supprimer une voiture avec la méthode "remove" de doctrine, et voici le service qui écrit dans un fichier :

public function createLog(LifecycleEventArgs $args, $action, User $user, array $changeArray, $container)
    {
        $entity = $args->getEntity();
        $extra =  array('AUTEUR' => $user->getNomUtil());

        if ($entity instanceof Equipement) {
            $message = 'Equipement > ID = '.$entity->getId().' > '.$action;
            $extra['Equipement'] = $entity->getEp10();
            $site = $entity->getSite();
            if ($site) {
                $extra['Site'] = $site->getNomSite();
            }
            else {
                $extra['Site'] = 'Hors site';
            }
        }
        elseif ($entity instanceof FormationEquipement) {
            $equip = $entity->getEquipement();
            $message = 'Equipement > ID = '.$equip->getId().' > '.$action;
            $extra['Utilisateur'] = $entity->getUtilisateur()->getNomUtil();
            $extra['Formation'] = $entity->getDateFormation()->format('Y-m-d');
            $extra['Equipement'] = $equip->getEp10();
        }
        elseif ($entity instanceof CalibrageEquipement) {
            $equip = $entity->getEquipement();
            $message = 'Equipement > ID = '.$equip->getId().' > '.$action;
            $extra['Date Calibrage'] = $entity->getDateCalibrage()->format('Y-m-d');
            $extra['Equipement'] = $equip->getEp10();
        }
        elseif ($entity instanceof ValeurParamEqpt) {
            $equip = $entity->getEquipement();
            $message = 'Equipement > ID = '.$equip->getId().' > '.$action;
            $extra['Parametre'] = $entity->getParametre()->getLibelleParam();
            $extra['Equipement'] = $equip->getEp10();
        }
        elseif ($entity instanceof CategorieEquip) {
            $message = 'Categorie Equipement > ID = '.$entity->getId().' > '.$action;
            $extra['Categorie'] = $entity->getNomCat();
            $extra['Site'] = $entity->getSite()->getNomSite();
        }

        if ($action == 'Update' && !($entity instanceof Document)) {
            foreach ($changeArray as $key => $value) {
                if (is_a($value[0],'DateTime' || is_a($value[0],'DateTimeImmutable'))) {
                    $extra['data'][$key][0] = $value[0]->format('Y-m-d H:i');
                }
                elseif (is_object($value[0]) && method_exists($value[0],'getId')) {
                    $extra['data'][$key][0] = $value[0]->getId();
                }
                else {
                    $extra['data'][$key][0] = $value[0];
                }

                if (is_a($value[1],'DateTime') || is_a($value[1],'DateTimeImmutable')) {
                    $extra['data'][$key][1] = $value[1]->format('Y-m-d H:i');
                }
                elseif (is_object($value[1]) && method_exists($value[1],'getId')) {
                    $extra['data'][$key][1] = $value[1]->getId();
                }
                else {
                    $extra['data'][$key][1] = $value[1];
                }
            }
        }

        $this->logger->info($message, $extra);

Ce bout de code n'a pas besoin d'être compris dans sa totalité non plus, c'est juste un exemple de ce qu'il se passe après le listener.
ici la voiture et la roue sont représentés par les types "Equipement" ou "FormationEquipement", "CalibrageEquipement" etc, faites comme ci c'était des voitures ou des roues. Pour l'exemple la voiture et la roue est plus simple.

Ce que je souhaiterais c'est que lors d'un $em->remove(), sur l'entité voiture il y ait une seule ligne dans le fichier de logs qui disent en premier : La voiture est supprimée et qui inclurai un message comme : Les roues de cette voiture sont également "supprimées. Or ce que j'ai actuellement c'est deux lignes, l'une avec la voiture l'autre avec les roues. En gros je souhaiterais que l'élément qui est passé en paramètre dans la fonction remove soit enregistré dans le log et que toutes les entités qui sont supprimées en cascade dans sa suppression soit enregistré dans ce même log mais à un niveau en dessous, et je n'y arrive pas. Parce-qu'en fait lors de la suppression de la voiture, les roues sont supprimées en premières, puis viens le tour de la suppression de la voiture, alors pas facile de mettre des conditions pour connaitre l'élément qui est passé à la fonction remove().

Pensez-vous avoir une solution qui se marie avec le code que je vous ai donné ?

Merci d'avance pour votre lecture et peut-être future réponse !

Alix

Aucune réponse