Partage
  • Partager sur Facebook
  • Partager sur Twitter

[Symfony5] Créer un historique

Créer un historique des actions menées sur une base de donnée

Sujet résolu
    6 mai 2021 à 16:15:53

    Bonjour!

    j'aimerais savoir comment puis mettre en place un système dans mon application qui pourra me permettre, quand je me connecte  de pouvoir constater toutes des actions (Création, modification, suppression) effectuées sur la base de donnée. Une sorte d'historique en fait.

    Merci d'avance pour votre aide !

    • Partager sur Facebook
    • Partager sur Twitter
      6 mai 2021 à 17:12:39

      Salut tu as plusieurs bundles qui proposent des systèmes de log sur l'évolution de tes entités.

      https://github.com/DamienHarper/auditor-bundle

      https://github.com/xiidea/EasyAuditBundle/tree/1.4.x

      https://github.com/doctrine-extensions/DoctrineExtensions/blob/main/doc/loggable.md

      Après à toi de voir celui qui répond le mieux à ton besoin.

      @+

      -
      Edité par Warps73 6 mai 2021 à 17:12:52

      • Partager sur Facebook
      • Partager sur Twitter

      While(true)

        6 mai 2021 à 17:43:38

        Merci pour ta réponse,

        Mon soucis c'est que j'ai du mal a en inclure un dans le projet et je ne comprend pas beaucoup leur fonctionnement, tout ce que je veux c'est l'historique et rien de plus mais il faut utiliser des "bundles" moi j'utillise Symfony de cette manière (oui je suis débutante :( ) :

        -
        Edité par LeenyChon 6 mai 2021 à 17:50:31

        • Partager sur Facebook
        • Partager sur Twitter
          7 mai 2021 à 10:18:02

          Salut, un bundle c'est une librairie que tu peux facilement inclure à ton projet Symfony ou autre d'ailleurs et qui amène un certain nombre d'outils ou de fonctionnalités.

          Je te conseille de les utiliser, car ils amèneront plus de stabilité à ton application web et te feront gagner du temps (Pourquoi devoir réinventer la roue ?).

          Si tu souhaites simplement avoir un historique je te dirais d'essayer https://github.com/doctrine-extensions/DoctrineExtensions/blob/main/doc/symfony4.md

          Pour l'installer, il faut procéder ainsi :

          A la racine de ton projet tu ouvres une console et tu tapes

          composer require gedmo/doctrine-extensions

          Si tout s'installe bien, il faut déclarer ton service de "loggable" dans le fichier de config

          Tu vas éditer ce fichier, s'il n'existe pas tu le crées.

          config/packages/doctrine_extensions.yaml

          Ensuite ta configue devra être comme ceci

          services:
              #Loggable
              Gedmo\Loggable\LoggableListener:
                  class: Gedmo\Loggable\LoggableListener
                  tags:
                      - { name: doctrine.event_subscriber, connection: default }
                  calls:
                      - [ setAnnotationReader, [ "@annotation_reader" ] ]

           Les lignes ci dessus permettent au loggable de s'abonner aux évènements Doctrines.

          Et dans config/packages/doctrine.yaml
              mappings:
                /.../
                loggable:
                  type: annotation
                  alias: Gedmo
                  prefix: Gedmo\Loggable\Entity
                  dir: "%kernel.project_dir%/vendor/gedmo/doctrine-extensions/src/Loggable/Entity"
          



          Le Bundle est maintenant prêt à être utilisé !

          Maintenant il faut que tu spécifies qu'elle(s) entité(s) tu souhaites loguer avec leurs propriétés et pour ça c'est tout simple!

          namespace App\Entity;
          
          // ... //
          use Gedmo\Mapping\Annotation as Gedmo; <-- Import
          
          /**
           * @Gedmo\Loggable <-- Annotation sur l'entité
           */
          class MaClass{
              /**
               * @Gedmo\Versioned  <-- Annotation sur la propriété
               */
              private $maProprieteALoguer;
          
          //..//
          }


          Et pour finir il faut générer la migration pour créer la table de log :

          php ./bin/console make:migration 

           Une nouvelle migration devrait se générer dans ton dossier migrations avec ceci. (Je pars du principe que tu utilises MySql)

          $this->addSql(
                      'CREATE TABLE ext_log_entries ....

          Tu appliques les modifications dans ta BDD

          php ./bin/console doctrine:migrations:migrate

           Une table ext_log_entries à dû être créée et normalement si tu viens à modifier une entité, tu devrais avoir une entrée qui se créée dans la table en question.

          C'est l'installation de base ci dessus et j'espère n'avoir rien oublié dans l'installation sinon fais le moi savoir :)

          Tu as la doc du bundle pour voir toutes les possibilités qu'il amène.

          Bon dev !

          @+






          -
          Edité par Warps73 7 mai 2021 à 17:42:11

          • Partager sur Facebook
          • Partager sur Twitter

          While(true)

            7 mai 2021 à 16:26:14

            Bonjour,

            J'ai suivis votre tutos, tout les fichiers se sont installés dans mon vendor. (comme on peut le voir sur la photo ci-dessous)

            J'ai rajouté moi-même "doctrine-extensions.yaml" et pris votre config

            j'ai ensuite fais la migration mais rien ne s'est passé, la table ext_log_entriesne s'est pas créer.

            Mes fichiers sont mal placés ? Dois-je les déplacer ? 

            • Partager sur Facebook
            • Partager sur Twitter
              7 mai 2021 à 17:20:02

              Ola, on peut essayer ça avant de régénérer les migrations.

              php ./bin/console cache:clear
              php ./bin/console make:migration

              EDIT : 

              Effectivement j'ai oublié de la config ( désolé...:euh: )

              Dans config/packages/doctrine.yaml

                  mappings:
                    // .. //
                    loggable:
                      type: annotation
                      alias: Gedmo
                      prefix: Gedmo\Loggable\Entity
                      dir: "%kernel.project_dir%/vendor/gedmo/doctrine-extensions/src/Loggable/Entity"
              






              -
              Edité par Warps73 7 mai 2021 à 17:38:15

              • Partager sur Facebook
              • Partager sur Twitter

              While(true)

                10 mai 2021 à 9:14:57

                Rebonjour,

                Merci pour votre aide, la table marche parfaitement.

                Par hasard vous savez comment afficher les données ?

                entity et repository sont créés mais pour l'afficher dans une page

                j'utilise cette méthode à la base :

                en essayant ma méthode j'ai ceci en message d'erreur:

                -
                Edité par LeenyChon 10 mai 2021 à 11:21:39

                • Partager sur Facebook
                • Partager sur Twitter
                  10 mai 2021 à 12:20:49

                  Bonjour, est-ce possible d'avoir une vision complète de votre code sans que ce soit une image ?
                  • Partager sur Facebook
                  • Partager sur Twitter

                  While(true)

                    10 mai 2021 à 14:08:49

                    J'ai fais ce Controller pour récupérer le repository qui se trouve dans le vendor: (vous voulez que je vous envoie le repository et l'entity également ?) 

                    <?php

                    namespace App\Controller;

                    // Entity
                    use Gedmo\Loggable\Entity\MappedSuperclass\AbstractLogEntry;
                    // Repository
                    use Gedmo\Loggable\Entity\Repository\LogEntryRepository;


                    use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
                    use Symfony\Component\HttpFoundation\Request;
                    use Symfony\Component\HttpFoundation\Response;
                    use Symfony\Component\Routing\Annotation\Route;

                    /**
                     * @Route("/ent")
                     */
                    class EntController extends AbstractController
                    {
                        /**
                         * @Route("/", name="ent_index", methods={"GET"})
                         */
                        public function index(LogEntryRepository $LogEntryRepository): Response
                        {
                            date_default_timezone_set('Europe/Paris');
                            return $this->render('log.html.twig', [
                                'ent' => $LogEntryRepository->getLogEntriesQuery(),
                            ]);
                        }
                    }

                    -
                    Edité par LeenyChon 10 mai 2021 à 14:09:37

                    • Partager sur Facebook
                    • Partager sur Twitter
                      10 mai 2021 à 14:36:44

                      Salut alors d'après la documentation il faut procéder ainsi.

                      use Doctrine\ORM\EntityManagerInterface;
                      use Gedmo\Loggable\Entity\LogEntry;
                      // ... //
                      
                      /**
                       * @Route("/ent")
                       */
                      class EntController extends AbstractController
                      {
                          /**
                           * @Route("/", name="ent_index", methods={"GET"})
                           */
                          public function index(EntityManagerInterface $em): Response
                          {
                              date_default_timezone_set('Europe/Paris');
                              $repo = $em->getRepository(LogEntry::class);
                              $ent = $em->find(Ent::class, $id /* Tu dois spécifier ton  Ent id*/);
                              $logs = $repo->getLogEntries($ent);
                              dd($logs);
                              return $this->render(
                                  'log.html.twig',
                                  [
                                      'ent' => $LogEntryRepository->getLogEntriesQuery(),
                                  ]
                              );
                          }
                      }



                      • Partager sur Facebook
                      • Partager sur Twitter

                      While(true)

                        10 mai 2021 à 16:17:41

                        J'ai toujours la même erreur :(

                        Cannot autowire argument $LogEntryRepository of "App\Controller\EntController::index()": it references class "Gedmo\Loggable\Entity\Repository\LogEntryRepository" but no such service exists.

                        Il ne trouve pas le repository, j'ai déjà essayé de le déplacer mais j'ai d'autres erreurs 

                        j'ai trouvé :

                        // file: src/Acme/DemoBundle/Controller/DemoController.php
                        // include this code portion
                        
                        /**
                         * @Route("/posts", name="_demo_posts")
                         */
                        public function postsAction()
                        {
                            $em = $this->getDoctrine()->getEntityManager();
                            $repository = $em->getRepository('AcmeDemoBundle:BlogPost');
                            // create some posts in case if there aren't any
                            if (!$repository->findOneById('hello_world')) {
                                $post = new \Acme\DemoBundle\Entity\BlogPost();
                                $post->setTitle('Hello world');
                        
                                $next = new \Acme\DemoBundle\Entity\BlogPost();
                                $next->setTitle('Doctrine extensions');
                        
                                $em->persist($post);
                                $em->persist($next);
                                $em->flush();
                            }
                            $posts = $em
                                ->createQuery('SELECT p FROM AcmeDemoBundle:BlogPost p')
                                ->getArrayResult()
                            ;
                            die(var_dump($posts));
                        }

                        https://github.com/doctrine-extensions/DoctrineExtensions/blob/main/doc/symfony2.md

                        mais je ne comprend pas trop ce code

                        -
                        Edité par LeenyChon 10 mai 2021 à 16:38:16

                        • Partager sur Facebook
                        • Partager sur Twitter
                          10 mai 2021 à 16:32:02

                          Il faut pas le déplacer et il ne faut pas utiliser le LogEntryRepository

                          use Doctrine\ORM\EntityManagerInterface;
                          use Gedmo\Loggable\Entity\LogEntry;
                          // ... //
                           
                          /**
                           * @Route("/ent")
                           */
                          class EntController extends AbstractController
                          {
                              /**
                               * @Route("/", name="ent_index", methods={"GET"})
                               */
                              public function index(EntityManagerInterface $em): Response
                              {
                                  date_default_timezone_set('Europe/Paris');
                                  $repo = $em->getRepository(LogEntry::class);
                                  $ent = $em->find(Ent::class, $id /* Tu dois spécifier ton  Ent id*/);
                                  $logs = $repo->getLogEntries($ent);
                                  dd($logs);
                                  return $this->render(
                                      'log.html.twig',
                                      [
                                          'ent' => $logs
                                      ]
                                  );
                              }
                          }



                          -
                          Edité par Warps73 10 mai 2021 à 16:32:38

                          • Partager sur Facebook
                          • Partager sur Twitter

                          While(true)

                            10 mai 2021 à 17:29:59

                            Dans le code il y a cette ligne : 
                            $ent = $em->find(Ent::class, $id /* Tu dois spécifier ton  Ent id*/);

                            J'essaye de faire un findAll qui récupère toute ce qu'il y a dans la table, doit-on vraiment mettre un id ?

                            ensuite que je met un id j'ai cette erreur :

                            Class 'App\Controller\Ent' does not exist

                            Quand je ne met pas d'id :

                            Too few arguments to function ContainerXSTxHfn\EntityManager_9a5be93::find(), 1 passed in C:\wamp64\www\REAPLE\osmose_projet\src\Controller\EntController.php on line 31 and at least 2 expected

                             On ne devrait plutôt faire une requête sql de ce type là ?

                                public function calculLocation2()
                                {
                                    return $this    -> getEntityManager()
                                                    -> createQuery( 
                                                    'SELECT a.ht, SUM(a.ht) AS horstaxe
                                                    FROM App\entity\Locations a
                                                    WHERE a.date_paiement = 2020 AND MONTH(a.date_paiement) = 01
                                                    ')
                                                    -> getResult();
                                }

                            Mais ou le mettre ensuite...

                            • Partager sur Facebook
                            • Partager sur Twitter
                              10 mai 2021 à 20:29:33

                              Tu as besoin de faire quoi exactement avec les logs ?
                              • Partager sur Facebook
                              • Partager sur Twitter

                              While(true)

                                11 mai 2021 à 9:06:38

                                J'ai juste besoin d'afficher tout ce qu'il y a dans la table 'ext_log_entries'
                                • Partager sur Facebook
                                • Partager sur Twitter
                                  11 mai 2021 à 11:36:34

                                  Ok alors tu peux faire comme ceci

                                  use Doctrine\ORM\EntityManagerInterface;
                                  use Gedmo\Loggable\Entity\LogEntry;
                                  // ... //
                                    
                                  /**
                                   * @Route("/ent")
                                   */
                                  class EntController extends AbstractController
                                  {
                                      /**
                                       * @Route("/", name="ent_index", methods={"GET"})
                                       */
                                      public function index(EntityManagerInterface $em): Response
                                      {
                                          date_default_timezone_set('Europe/Paris');
                                          $repo = $em->getRepository(LogEntry::class);
                                          $logs = $repo->findAll();
                                          dd($logs);
                                          return $this->render(
                                              'log.html.twig',
                                              [
                                                  'ent' => $logs
                                              ]
                                          );
                                      }
                                  }





                                  • Partager sur Facebook
                                  • Partager sur Twitter

                                  While(true)

                                    11 mai 2021 à 17:32:59

                                    Alors effectivement nous avons un affichage comme un console log

                                    sauf que je cherche à faire quelque chose dans le style pour faire un tableau avec toute les infos, c'est juste de l'affichage et non pas un console log. Dans la mesure ou c'est possible de faire ça évidemment.

                                    • Partager sur Facebook
                                    • Partager sur Twitter

                                    [Symfony5] Créer un historique

                                    × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                                    × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                                    • Editeur
                                    • Markdown