Aller au contenu

phil/doctrine-behaviours

alpha

Douze comportements Doctrine, de l'horodatage et des arbres aux positions, aux slugs, aux traductions et aux versions, chacun à activer au besoin.

phil/doctrine-behaviours donne douze comportements aux entités de Doctrine ORM. L'horodatage note quand une entité est créée et modifiée, en UTC. L'auteur garde qui l'a créée et qui l'a changée en dernier, comme identifiant d'utilisateur. La suppression douce cache une entité supprimée derrière un filtre au lieu de l'effacer, et la supprimer une seconde fois l'efface. Les arbres gardent le chemin matérialisé et la profondeur de chaque nœud, et le lecteur Tree donne les racines, les enfants, les descendants, les ancêtres et la hiérarchie. La désactivation éteint un enregistrement et le rallume derrière un filtre qui lui est propre. Un propriétaire est un identifiant stable, jamais une adresse courriel. La publication est un état de symfony/workflow avec ses dates. Une position ordonne les enregistrements dans un groupe, et un enregistrement se déplace avant ou après un autre. Un slug fait par phil/slug reste unique dans sa table, ou dans une portée comme un locataire, une locale ou un parent. Les traductions gardent le texte d'un enregistrement dans une ligne par locale, lue le long d'une chaîne de repli déclarée et jamais recopiée d'une locale à l'autre. Les versions figent ce que tenait un enregistrement, créent la version suivante à la modification d'après, et reviennent en arrière sous un droit qui leur est propre. Un identifiant daté est un UUID v7.

Elle s'adresse à toute application sur Doctrine ORM qui a besoin de ces colonnes sans écrire ses propres écouteurs. Chaque comportement est indépendant : une application n'enregistre que les écouteurs qu'utilisent ses entités. Les arbres sont des chemins matérialisés : déplacer une branche est une seule mise à jour au lieu d'une renumérotation de l'arbre. Dans une application Symfony, phil/doctrine-behaviours-bundle enregistre les écouteurs, le filtre et l'auteur qu'est l'utilisateur authentifié. Un enregistrement qui doit quitter sa table, prêt à être ramené, va plutôt dans phil/trash-bundle.

C'est une librairie PHP simple sur Doctrine ORM, DBAL, psr/clock et phil/locale-dimensions ; phil/slug, symfony/uid et symfony/workflow ne servent qu'aux comportements qui les nomment. Chaque comportement est une interface, un trait qui mappe ses colonnes, et un écouteur qui les tient. Qui agit vient d'un BlameResolver que fournit l'application, comme FixedBlame pour une commande qui agit pour un compte connu, ou pour un test.

État

PartieÉtat
Contract\Timestampable, TimestampableEntity, TimestampListenerImplémenté et testé
Contract\Blameable, BlameableEntity, BlameListener, Contract\BlameResolver, FixedBlameImplémenté et testé
BlameEraser : le nom d'un utilisateur trouvé et remplacé dans chaque table qui garde l'auteurImplémenté et testé
Contract\SoftDeletable, SoftDeletableEntity, SoftDeleteListener, SoftDeletedFilterImplémenté et testé
Contract\TreeNode, TreeNodeEntity, TreeListener, Tree, BranchImplémenté et testé
Deactivatable, DeactivatableEntity, DeactivationListener, DeactivatedFilterImplémenté et testé
OwnerId, Ownable, OwnableEntity, OwnerListener, OwnerResolver, FixedOwner, OwnerEraserImplémenté et testé
Publishable, PublishableEntity, PublicationWorkflow, PublicationListenerImplémenté et testé
Contract\Positionable, PositionableEntity, PositionListener, Positions, groupesImplémenté et testé
Contract\Sluggable, SluggableEntity, ScopedSluggableEntity, SlugListener, portéesImplémenté et testé
Contract\Translatable, Contract\Translation, TranslationEntity, TranslationListener, TranslationsImplémenté et testé
Versionable, VersionableEntity, VersionListener, Versions, RecordVersion, VersionRestoreGuardImplémenté et testé
DatedIdentifiable, DatedIdentifierEntity, DatedIdentifierListenerImplémenté et testé

Documentation

DocumentContenu
Horodatage et auteurQui et quand, ce qu'une entité a reçu et garde, la vie privée et l'effacement.
Suppression douceLa suppression comme date, le filtre, la restauration, l'effacement pour de bon.
ArbresLes chemins, les déplacements d'une branche, la lecture d'un arbre.
DésactivationÉteindre et rallumer un enregistrement, le filtre, ce qui la distingue de la suppression douce.
PropriétaireUn identifiant stable, le résolveur, la remise à quelqu'un d'autre, l'effacement.
PublicationLa machine à états, ses dates, la publication à une heure fixée.
PositionL'ordre dans un groupe, les déplacements avant et après, l'index.
SlugQuand un slug est fait, comment il reste unique, dans la table ou dans une portée.
TraductionUne ligne par locale, lue le long d'une chaîne de repli, une liste en une requête, l'écriture sans copie, les slugs et les versions par locale.
VersionsFiger, créer la version suivante, revenir en arrière sous un droit qui lui est propre.
Identifiant datéUn UUID v7 comme clé primaire.
IntégrationEnregistrer les écouteurs et le filtre sans Symfony.
Points d'extensionLes ports, les arguments et les données qu'une application choisit ou remplace.
TestsComment la librairie est testée.

Démarrage rapide

#[ORM\Entity]
class Category implements Timestampable, Blameable, SoftDeletable, TreeNode
{
    use TimestampableEntity;
    use BlameableEntity;
    use SoftDeletableEntity;
    use TreeNodeEntity;

    #[ORM\ManyToOne(targetEntity: self::class)]
    private ?self $parent = null;

    public function treeId(): string { return (string) $this->id; }
    public function treeParent(): ?self { return $this->parent; }
}
$tree->hierarchy(Category::class);    // list<Branch>, each node with its children
$tree->ancestors($category);          // the root down to the parent

Dans une application Symfony, phil/doctrine-behaviours-bundle enregistre les écouteurs et le filtre.

Prérequis

PHP 8.5 ou une version plus récente, Doctrine ORM 3.7 ou plus récent, DBAL 4.5, doctrine/collections, psr/clock et phil/locale-dimensions ; phil/slug pour les slugs, symfony/uid pour les identifiants datés, et symfony/workflow pour la publication.

Contribuer

Les contributions sont les bienvenues sur le monodépôt PHIL : lisez le guide de contribution et le code de conduite. Signalez une vulnérabilité en privé, comme l'explique la politique de sécurité, jamais dans un ticket public.

Licence

MIT, © Philippe Gamache, doing business as Le Gnome Archiviste; a Parler Haut Interagir Librement project. Voyez LICENSE.