Les Uuids avec Symfony/Doctrine/ApiPlatform

Il peut arriver de travailler avec des Uuidsarrow-up-right plutôt que des "ID" classique (i.e. les auto-increments des bases de données.

Par exemple un Uuid de version 4 ressemblera à: 3e9809bc-496c-44fe-afd6-a12f803b9c4a, c'est cette version que nous utiliserons.

Avantages:

  • Unicité globale: plusieurs systèmes en parallèle peuvent ainsi créé des IDs uniques, là ou les id auto-incrémenté, doivent être générés sur un système centralisé pour garantir leur unicité

  • Connu à l'avance: On connait l'identifiant unique de notre objet dès la génération de notre Uuid: via du code PHP, via du SQL ou tout autre language le supportant. Pas besoin de faire un insert en base pour récupèrer l'ID par exemple

  • Sécurisé: il est quasiment impossible de deviner un UUID

Inconvénients:

  • Performance: comparé à une suite de chiffre, les Uuids sont plus couteux à manipuler, et aussi à rechercher dans une base de données (invisible la plupart du temps + possible de le minifer, avec un stockage sous forme binaire plutôt que textuel)

  • Tailles: avec 32 caractères, il est impossible à retenir et peut complexifier le debug (comparé à un id auto-incrémenter)

Symfony et les uuids

La doc officielle

Symfony propose un composant assez simple à utiliser et bien documenter.

En bref:

Pour jouer avec les uuids:

Doctrine et les uuids

Il est possible d'utiliser un Uuid en tant que clé primaire (id) dans votre entité:

Plusieurs choses à noter:

  • Le type de colonne UuidType permet d'indiquer à doctrine qu'on souhaite utiliser un Uuid pour ce champ. En interne, doctrine crée un champ de type binaire dans une base de données SQL (afin d'optimiser le stockage ainsi que la vitesse de recherche).

  • La stratégie pour généré une valeur en base à été mise à 'NONE', afin d'indiquer à doctrine que ce n'est pas à la base de généré cette valeur (chose qu'elle ferait pour un auto-increment classique) mais que c'est notre code qui générera cette valeur. (ici, cette valeur est défini dans notre fonction __construct()

ApiPlatform et les uuids

ApiPlatform gère nativement les uuids.

Cependant, par sécurité on viendra spécifier le fonctionnement de cette proprités grace à un attribut:

Cet attribut ApiProperty configure deux choses au niveau de l'API:

  • writable: false, passe le champs en lecture seule au niveau de l'API, afin d'éviter que n'importe qui puisse écrire son propre uuid et laisser au back la responsabilité de le générer

  • identifier: true, indique à ApiPlatform que ce champs est l'identifiant de notre ressoure côté API.

Last updated