Aller au contenu

Désactivation

phil/doctrine-behaviours
TypeGenreRôle
Contract\DeactivatableinterfaceisActive(), deactivatedAt(), deactivate(), reactivate(), stampDeactivated()
DeactivatableEntitytraitLes colonnes active, booléenne, et deactivated_at, datetime_immutable, nullable
DeactivationListenerécouteur : prePersist, onFlushGarde la date accordée à l'état, en UTC
DeactivatedFilterfiltre SQL phil_deactivatedactive = true sur chaque entité Deactivatable

Un enregistrement désactivé est éteint, non supprimé : sa ligne reste entière, ses relations restent, et il revient d'un seul appel. La suppression douce dit qu'un enregistrement n'est plus là, et une seconde suppression l'efface ; la désactivation ne dit rien de tel, et les deux peuvent se combiner sur une même entité.

$member->deactivate();
$manager->flush();                                 // active = false, deactivated_at = now

$manager->getFilters()->disable(DeactivatedFilter::NAME);
$member = $members->find($id);
$member->reactivate();
$manager->flush();                                 // active = true, deactivated_at = null
Vidagedeactivated_at
une entité éteintemis à maintenant, sauf si une date lui a été donnée
une entité ralluméeoublié
une entité persistée déjà éteintemis à maintenant, sauf si une date lui a été donnée

Une importation qui garde une date d'origine appelle elle-même stampDeactivated(), et l'écouteur la laisse en paix.

Tant qu'il est actif, le filtre cache les lignes désactivées de chaque requête, collections chargées à la demande comprises. Un écran d'administration le désactive pour ses requêtes. Une relation vers un seul côté qui pointe vers une ligne désactivée rencontre ce que rencontre une relation vers une ligne supprimée en douceur : voir Suppression douce.

Le filtre compare la colonne avec la graphie du vrai propre à la base : 1 sur MySQL et SQLite, true sur PostgreSQL.