Chargement...

Symfony : Comment utiliser un id custom et unique sur une entité

Tu cherches comment créer un id unique et custom pour ta classe Symfony c'est par ici !

Bonjour à toutes et à tous, je fais ce petit tutoriel pour vous aider à implémenter dans une de vos classes un id custom et unique. J'ai rencontré cette problèmatique en démarrant un projet orienté SAAS mais cette pratique peut être mise en place sur un projet symfony standard.

Pour commencer, voici un exemple d'un id classique fourni par le générateur de CRUD :

 


/**
 * Contact
 *
 * @ORM\Table(name="back_contact")
 * @ORM\Entity(repositoryClass="BackBundle\Repository\ContactRepository")
 */
class Contact {

    /**
     * @var integer
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

 

L'exemple ci-dessus permet une utilisation classique de Doctrine et générera automatiquement les contacts avec les ids : 1, 2, 3, 4, 5 etc...

 

Commencez tout d'abord par rajouter ce vendor dans votre composer.json :

"ramsey/uuid": "^3.7"

Ensuite on met à jour notre projet via composer avec composer update.

 

Super le bundle qui va gérér la génération d'id via uuid est maintenant actif dans votre projet !

Je vous montre de suite le petit bout de code qui me permet de générer un id unique et custom en Symfony :

 


    /**
     * @var string
     *
     * @ORM\Column(name="id", type="string")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="CUSTOM")
     * @ORM\CustomIdGenerator(class="BackBundle\Doctrine\IdGenerator")
     */
    private $id;

 

Dans cette exemple on se sert d'une classe IdGenerator pour calculer et générer notre id. Cette classe est située dans le dossier Doctrine de mon bundle BackBundle. Voici le code de cette classe : 

 


namespace BackBundle\Doctrine;

use Doctrine\ORM\EntityManager;
use Doctrine\ORM\Id\AbstractIdGenerator;
use Ramsey\Uuid\Uuid;

/**
 * {@inheritdoc}
 */
class IdGenerator extends AbstractIdGenerator
{
    /**
     * {@inheritdoc}
     */
    public function generate(EntityManager $em, $entity)
    {
        $uuid = Uuid::uuid4()->getHex();

        if (null !== $em->getRepository(get_class($entity))->findOneBy(['id' => $uuid])) {
            $uuid = $this->generate($em, $entity);
        }

        return $uuid;
    }
}

 

Voilà n'oubliez pas de flush le schema de votre base de données à l'aide de la commande :

php app/console doctrine:schema:update --force

Pour finir on clear le cache :

php app/console cache:clear --env=dev

 

J'éspère que ce petit bout de code pourra servir et je vous dis à très vite :)

 

N'hésitez pas à laisser des commentaires sur cet article, je vous répondrai avec plaisir !


Tags sur l'article

Commentaires (1)

Notoire Francois
dépose le 20/10/2017

Merci pour cet example j'avais bien compris le principe mais impossible de mettre ça en place j'avais toujours des erreur avec doctrine sur les unique ID ! Des erreurs auto generate ID doctrine etc.. Du bon boulot merci !

Laisser nous un commentaire