Symfony, créer son propre générateur d’ID (Code jetable, …)

Salut à tous,

Dans un récent projet, j’ai dû générer des codes jetables qui n’étaient pas « devinable », j’ai découvert pour ce faire, le AbstractIdGenerator, qui permet de générer ses propres clés. (J’aurais pû le faire sur un champs à part et filtrer dessus, mais bon 🙂 … c’est d’un manque totale d’élégance intellectuelle …).

Au final le code est plutôt simple :

<?php

namespace VIPros\CoreBundle\Core\Points;

use Doctrine\ORM\EntityManager;
use Doctrine\ORM\ORMException;

class CodeGenerator extends \Doctrine\ORM\Id\AbstractIdGenerator
{
/**
* Generates the identifier assigned to the given entity.
*
* @param object $entity
* @return mixed
* @override
*/
public function generate(EntityManager $em, $entity)
{
return str_replace('.','-',substr(uniqid('',true),10,9));
}
}

Ici, on créé un code de type 1234-12345 pouvant utiliser des lettres et des chiffres, avec pas mal de possibilités sans être « devinable ».

Et l’utilisation reste simple :

<?php

namespace VIPros\CoreBundle\Entity\Points;

use Doctrine\ORM\Mapping as ORM;
 use JMS\Serializer\Annotation as Serializer;

/**
 * Code
 *
 * @ORM\Table(name="points_code")
 * @ORM\Entity(repositoryClass="VIPros\CoreBundle\Repository\Points\CodeRepository")
 */
 class Code
 {
 /**
 * @var int
 *
 * @Serializer\Expose
 * @Serializer\Groups({"default"})
 * @ORM\Column(name="id", type="string",length=10)
 * @ORM\Id
 * @ORM\GeneratedValue(strategy="CUSTOM")
 * @ORM\CustomIdGenerator(class="VIPros\CoreBundle\Core\Points\CodeGenerator")
 */
 private $id;

/*Reste de votre classe ici*/

}

Et c’est tout :).