Bonjour,
Je suis sur la problématique d'identifiant unique pour mon application. Ces identifiants sont "affichés" sur le site public via un nouveau champ dans mon entité (idPublic). J'ai 2 contraintes:
1. Les identifiants ne doivent pas être devinés. Donc on oublie l'id auto-généré (XXX1,XXXX2,XXX3...)
2. Ils doivent être "courts" (< 10 caractères). C'est pour cela que je n'utilise plus la fonction uniqid qui répondait jusqu'à présent très bien à la première contrainte mais plus à celle-ci.
J'étais parti sur le principe suivant :
A. Toujours utiliser uniqid qui fournit beaucoup de caractères, mais je le tronque aux 6 ou 7 premiers caractères
B. Avec ça, il y a du coup des risques non négligeables de collisions entre identifiants. Je voulais donc suffixer ce numéro aléatoire par l'identifiant interne auto-généré par doctrine (1, 2, 3, 4, ....) : idPublic = uniqid + id
Avec cette méthode, je suis sur d'avoir des identifiants uniques et non devinables. Le problème est l'application de cette méthode. Vu que j'ai besoin de l'id interne, je voulais passer par les évènements doctrine. Le problème est que l'évènement PrePersist n'a pas encore connaissance de l'id auto-généré (ce qui est logique), donc je ne peux pas créer mon idPublic ici ; et dans l'évènement PostPersist, on a bien connaissance de l'id auto-généré, mais les modifications apportées à l'entité ne seront pas appliquées (ce qui est logique, x2), donc pas moyen de sauvegarder l'idPublic calculé....
Du coup, ma question est simple mais ouverte : y'a-t-il un moyen de faire ce que je veux faire (sans passer par 2 flushs d'affilé, un peu moche...) ; ou : connaissez-vous une "meilleure" solution qui respectent mes 2 contraintes initiales ?
Merci !
Partager