JUL6ART
🇫🇷 FR
Retour au blog
23 April 2026

Soft-delete par défaut : aucune perte silencieuse

Toutes les entités métier sont restaurables, et seul le super-admin peut le faire.

Quand un utilisateur supprime un contact, un deal, une page ou un commentaire, deux choses ne doivent jamais arriver : (1) la donnée disparaît du disque sans recours, (2) la donnée reste visible dans les listings après suppression.

Jul6art applique le pattern soft-delete à toutes les entités métier :

  • Le trait SoftDeletableTrait ajoute la colonne deleted_at et les méthodes softDelete() / restore().
  • Un filtre Doctrine global soft_delete exclut automatiquement les lignes deleted_at IS NOT NULL de toutes les requêtes — sauf pour ROLE_SUPER_ADMIN qui voit l'intégralité.
  • La route de restauration /admin/.../{id}/restore est gardée par ROLE_SUPER_ADMIN : aucun admin tenant ne peut restaurer.
  • Sur les colonnes UNIQUE (email d'un Contact), la valeur est suffixée par _DELETED_<timestamp> au moment du soft-delete pour libérer la contrainte tout en conservant la trace.
  • Les paires d'événements BEFORE_SOFT_DELETED / AFTER_SOFT_DELETED + BEFORE_RESTORED / AFTER_RESTORED sont dispatchés sur chaque opération, avec un contrat abort() qui permet de bloquer la suppression depuis un listener.

Résultat : une suppression accidentelle est récupérable en deux clics côté super-admin, et aucune trace n'est jamais perdue.