Symfony: cómo identificar con UUIDs las entidades

2022-10-01 - Categorías: PHP / Symfony

¡Hola de nuevo! Hoy traigo un pequeño howto o codekata para mover la identificación de una entidad Symfony, en el caso de que estemos usando Doctrine, para cambiar de IDs a UUIDs. Vamos al grano..

Generando un proyecto de pruebas

Para esto podemos ir a línea de comandos y generarlo. Por ejemplo, vamos a hacer un microservicio que se a usar para almacenar coordenadas:

symfony new symfony-locations
cd symfony-locations
composer require doctrine
composer require --dev maker
php bin/console make Location

..y seguimos las instrucciones del maker que nos generará el código fuente:

..ahora toca conectar la BD para que todo funcione, lo podemos hacer con el clásico fichero de parámetros de configuración que todo proyecto suele tener, en Symfony en el .env por ejemplo:

DATABASE_URL="mysql://usuario:thepass@127.0.0.1:3306/symfony-locations?serverVersion=8&charset=utf8mb4"

Ahora tenemos que crear la BD y la tabla que se corresponde con la entidad Location que acabamos de generar:

php bin/console doctrine:database:create
php bin/console doctrine:schema:create

Generando un nuevo campo UUID en una entidad de Doctrine

Si vamos ahora a ver la BD y la entidad en los códigos fuentes, veremos que por defecto Doctrine nos ha generado el identificador llamado ‘id’ que es de tipo entero. Lo podemos ver en el fichero src/Entity/Location.php:

Si ya estamos usando esta identificación tendremos que generar un nuevo campo. Primero necesitamos que Symfony tenga las herramientas de UUIDs para esto vamos a consola a instalar:

composer require symfony/uid

..lo siguiente entonces es editar la entidad Location, añadiendo un nuevo campo UUID, aunque también podemos modificar el ID que tenemos actualmente:

..y usamos el actualizador automatizado de la BD para que aplique los cambios en la BD sin esfuerzo:

php bin/console doctrine:schema:update --dump-sql

Modificando la identificación por IDs a identificación por UUIDs

Si estamos trabajando en un proyecto ya funcionando, nos tocará llenar los datos de los UUIDs, arreglar las referencias a otras tablas, etc.. Pero si es un proyecto nuevo, simplemente ya podremos cambiar la identificación de la tabla, para que sea el UUID clave primaria. Para hacer esto basta con cambiar lo siguiente en la entidad:

    /**
     * @ORM\Id
     * @ORM\GeneratedValue
     * @ORM\Column(type="integer")
     */
    private $id;

    /**
     * @ORM\Column(type="uuid")
     */
    private $uuid;

..por:

    /**
     * @ORM\Id
     * @ORM\Column(type="uuid")
     */
    private $uuid;

..borramos los getter y setter del campo $id, y actualizamos la BD, de nuevo usando el actualizador de Symfony para ahorrarnos tiempo:

php bin/console doctrine:schema:update --dump-sql --force

Terminando, generando algunas coordenadas con UUIDs

Para terminar ya sólo queda probarlo, decir que tenemos varias versiones de UUIDs para generar estas identificaciones. Por ejemplo podríamos hacer un comando:

php bin/console make:command GenerateLocations

..con una prueba que va generando UUIDs:

<?php

namespace App\Command;

use App\Entity\Location;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;
use Symfony\Component\Console\Style\SymfonyStyle;
use Symfony\Component\Uid\Uuid;

class GenerateLocationsCommand extends Command
{
    protected static $defaultName = 'app:generate-locations';
    protected static $defaultDescription = 'Generate a Location';

    private $entityManager;

    public function __construct(EntityManagerInterface $entityManager)
    {
        parent::__construct();

        $this->entityManager = $entityManager;
    }

    protected function execute(InputInterface $input, OutputInterface $output): int
    {
        $io = new SymfonyStyle($input, $output);

        $newLocation = new Location();
        $newLocation->setUuid(Uuid::v6());
        $newLocation->setLatitude(1);
        $newLocation->setLongitude(2);
        $this->entityManager->persist($newLocation);

        $io->success('Location generated!');

        return Command::SUCCESS;
    }
}

Sólo me queda remitirte a la documentación oficial para más información:
https://symfony.com/doc/current/components/uid.html

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

 

© 2022 JnjSite.com - MIT license

Sitio hecho con WordPress, diseño y programación del tema por Jnj.