Gestion des identités et Domain Driven Design

Cet article a été publié depuis plus de 6 mois, cela signifie que le contenu peut ne plus être d'actualité.

Maîtriser la gestion des identités de nos entités dans une application dont la conception est pilotée par le domaine (Domain Driven Design) est un enjeu majeur. Cela permet notamment d’être découplé de son système de gestion de base de données et d’avoir une maîtrise totale de la gestion des données métier.

Il existe pour cela de nombreuses solutions possibles. Celle qui est certainement la plus commune (parce qu’il s’agit d’une des plus simples) est d’utiliser des identifiants uniques universels (Universally Unique IDentifier en anglais), plus couramment appelés UUID. Ce dernier peut être utilisé conjointement avec l’identifiant auto-incrémenté qui est généralement utilisé par défaut dans nos bases de données relationnelles. La plupart des ORM sont d’ailleurs capables de le gérer nativement. Mais il sera préférable de gérer la création de l’UUID soi-même pour éviter d’être dépendant du composant qui interagit avec votre base de données. En PHP, vous pourrez utiliser ramsey/uuid ou encore symfony/uid.

<?php

use Ramseu\Uuid\UuidInterface;

class MyEntity
{
    public function __construct(
        private UuidInterface $uuid,
    ){
    }
}

Il n’est pas toujours nécessaire d’utiliser un identifiant unique aléatoire. Selon le type de données que vous manipulez, vous travaillez peut-être avec des clés naturelles. Par exemple, si vous gérez une bibliothèque de livres ou que vous êtes amené à manipuler des numéros de sécurité sociale. Dans le premier cas, un livre est identifié par un numéro international normalisé: l’ISBN. Analysez donc bien les données que vous manipulez, car selon le métier que vous cherchez à modéliser, il n’est pas toujours nécessaire de passer une solution technique.

<?php

class Book
{
    public function __construct(
        private ISBN $isbn,
    ){
    }
}

Dans certains contextes, il est nécessaire d’utiliser des identifiants séquentiels. Dans ce cas précis, il est intéressant d’utiliser le mécanisme d’auto-incrément de la base de données. Afin de rester indépendant de notre système de base de données, il est alors primordial d’être capable de récupérer la valeur de l’identifiant avant d’écrire la donnée. Une technique pouvant être utilisée est de créer une table avec un identifiant auto-incrémenté, que l’on utilisera comme système de réservation. Pour obtenir la valeur, il faudra insérer une ligne dans cette table et l’utiliser l’identifiant généré comme identifiant de notre entité.

Nous venons de voir les 3 approches les plus couramment utilisées pour gérer les identités de nos entités dans un projet piloté par le domaine. Les approches listées ici ne sont pas exhaustives, mais ont pour but de vous montrer les solutions les plus simples et courantes. Peut-être vous demandez-vous laquelle utiliser ?

Comme toujours en informatique, il n’y a pas de recette universelle, cela dépendra de votre contexte. Si dans une grande majorité des cas, l’utilisation d’UUID sera suffisant, il y a des cas plus complexes qui nécessiteront une approche alternative. A vous de choisir la bonne solution en fonction de votre contexte métier.