334 mots
2 minutes
Auditor Bundle: Suivi des Modifications en Symfony

Il peut arriver que, dans un projet, vous ayez besoin d’un historique des actions sur une table particulière (create, update, delete). Par exemple, vous avez une table contenant des droits et vous aimeriez savoir qui a modifié quoi et quand.

Pour cela, une librairie appelée auditor-bundle, développée par Damien Harper, permet de répondre à ce besoin de manière très simple.

Vous pouvez consulter la documentation complète ici : Documentation Auditor.

Installation de la librairie#

Pour installer la librairie, utilisez la commande suivante :

composer require damienharper/auditor-bundle

Après avoir créé une table User (qui ne contient qu’un champ username), nous allons créer une table pour les droits :

<?php

namespace App\Entity;

use App\Repository\PermissionRepository;
use DH\Auditor\Provider\Doctrine\Auditing\Annotation\Auditable;
use Doctrine\ORM\Mapping as ORM;

#[ORM\Entity(repositoryClass: PermissionRepository::class)]
#[Auditable]
class Permission
{
    #[ORM\Id]
    #[ORM\GeneratedValue]
    #[ORM\Column]
    private ?int $id = null;

    #[ORM\ManyToOne(inversedBy: 'permissions')]
    #[ORM\JoinColumn(nullable: false)]
    private ?User $user = null;

    #[ORM\Column(length: 20)]
    private ?string $role = null;

    public function getId(): ?int
    {
        return $this->id;
    }

    public function getUser(): ?User
    {
        return $this->user;
    }

    public function setUser(?User $user): static
    {
        $this->user = $user;
        return $this;
    }

    public function getRole(): ?string
    {
        return $this->role;
    }

    public function setRole(string $role): static
    {
        $this->role = $role;
        return $this;
    }
}

Audit des changements#

Notez l’attribut #[Auditable] qui indique à la librairie que cette table doit être auditée.

Après avoir exécuté votre migration, une nouvelle table permission_audit sera créée, et elle stockera toutes les actions effectuées sur la table permission.

Test avec un contrôleur#

Créons un contrôleur pour tester le fonctionnement (à ne surtout pas reproduire en production) :

<?php

namespace App\Controller;

use App\Entity\Permission;
use App\Entity\User;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\Security\Core\Security;

class AuditController extends AbstractController
{
    #[Route('/audit', name: 'app_audit')]
    public function index(EntityManagerInterface $entityManager, Security $security): Response
    {
        $user = new User();
        $user->setUsername('admin');
        $entityManager->persist($user);
        $entityManager->flush();

        $security->login($user);

        $permission = new Permission();
        $permission->setUser($user);
        $permission->setRole('ADMIN');
        $entityManager->persist($permission);
        $entityManager->flush();

        $permission->setRole('USER');
        $entityManager->flush();

        $entityManager->remove($permission);
        $entityManager->flush();

        return $this->render('audit/index.html.twig', []);
    }
}

Résultat dans la table d’audit#

Après avoir visité la page /audit, voici un aperçu de ce que contient la table permission_audit :

audit

La colonne importante est diffs, un JSON contenant les différences entre deux versions de l’entité.

Bon audit !