Les Uuids avec Symfony/Doctrine/ApiPlatform
Il peut arriver de travailler avec des Uuids 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
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
UuidTypepermet d'indiquer à doctrine qu'on souhaite utiliser un Uuid pour ce champ. En interne, doctrine crée un champ de typebinairedans 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éreridentifier: true, indique à ApiPlatform que ce champs est l'identifiant de notre ressoure côté API.
Last updated
