Aller au contenu

Horodatage et auteur

phil/doctrine-behaviours
TypeGenreRôle
Contract\TimestampableinterfacecreatedAt(), updatedAt(), stampCreated(), stampUpdated()
TimestampableEntitytraitLes colonnes created_at et updated_at, datetime_immutable
TimestampListenerécouteur : prePersist, onFlushHorodate à l'heure de l'horloge, en UTC
Contract\BlameableinterfacecreatedBy(), updatedBy(), blameCreated(), blameUpdated()
BlameableEntitytraitLes colonnes created_by et updated_by, 255 caractères, nullables
BlameListenerécouteur : prePersist, onFlushInscrit comme auteur celui que nomme le résolveur
Contract\BlameResolverinterfacecurrent(): ?string, qui agit en ce moment
FixedBlameBlameResolverToujours le même, ou personne
BlameEraserserviceTrouve et remplace le nom d'un utilisateur dans chaque table qui garde l'auteur

Quand

VidageHorodatageAuteur
une entité persistéecreatedAt, puis updatedAt, mis à maintenant sauf s'ils sont déjà donnéscreatedBy, puis updatedBy, mis à celui qui agit sauf s'ils sont déjà donnés
une entité modifiéeupdatedAt mis à maintenant, sauf si la modification le fixe elle-mêmeupdatedBy mis à celui qui agit, sauf si la modification le fixe
personne de connu—rien n'est écrit

Ce qu'une entité a reçu reste : une importation qui garde ses dates et ses auteurs d'origine appelle elle-même stampCreated(), blameCreated(), stampUpdated() ou blameUpdated(), et les écouteurs laissent ces valeurs en paix.

L'auteur est un nom de l'utilisateur — ce que donne le résolveur — et non une relation vers une entité utilisateur : la colonne survit au compte, et aucune entité n'a à connaître la classe de l'utilisateur.

Vie privée

Ce que donne le résolveur est copié dans chaque ligne qui garde l'auteur, et conservé après la disparition du compte. Quand c'est une adresse courriel — le getUserIdentifier() de Symfony Security en est souvent une —, les colonnes de l'auteur contiennent un renseignement personnel. Nommez les utilisateurs par un identifiant stable qui n'en est pas un, comme un UUID, là où le résolveur le permet.

BlameEraser répond aux demandes d'accès et d'effacement : find($who) compte les lignes qui nomment quelqu'un dans chaque table qui garde l'auteur, et replace($who, $replacement) met à leur place un pseudonyme, ou null, dans created_by et updated_by de chaque entité Blameable — dans la table du parent pour une sous-classe qui en hérite. Il travaille directement sur les tables : les lignes supprimées en douceur et celles qu'un filtre SQL cache sont trouvées aussi, et aucun écouteur n'horodate les lignes qu'il change. tables() liste chaque table qui garde l'auteur, trouvée ou non, pour un rapport qui nomme chaque lieu de stockage.

$eraser->find('ada@example.com');                 // ['article' => 12, 'page' => 3]
$eraser->replace('ada@example.com', 'former-member-81');
$eraser->tables();                                // ['article', 'note', 'page']