En ocasiones no nos interesa mostrar el id incremental del registro de nuestra base de datos, para evitar esto hay varias formas de hacerlo. En esta entrada, vamos a ver una con el paquete Laravel Uuid que nos provee una forma sencilla de validar y generar UUID. Los UUID son identificadores únicos universales, es decir, un UUID es un identificador de 32 dígitos que solamente pertenecerá a un único registro y que no se repetirá en nuestra base de datos.
Instalamos el paquete:
1 |
composer require webpatser/laravel-uuid |
Cuando finalice la instalación, vamos a Tinker ( php artisan tinker ) como en la entrada anterior para generar un UUID de ejemplo y ver que funciona correctamente:
Podemos ver el formato que tiene un UUID. En la documentación del paquete hay más ejemplos de como generarlos, le puedes indicar la versión y otras opciones.
Ahora vamos a hacer que la tabla de posts tenga un campo UUID y que se genere automáticamente cuando creas un post.
Primero creamos la migración o modificamos la que ya teniamos:
1 |
php artisan make:migration create_posts_table |
Yo como ya la tenía, la he modificado. También podríamos crear una migración simplemente para añadir el campo.
Añadimos el código para crear el campo UUID:
1 2 3 |
... $table->uuid('uuid')->unique()->index(); ... |
Ejecutamos las migraciones y ya tendremos el campo en nuestra base de datos.
Ahora vamos a crear un Observer para que cada vez que se cree un post se añada el UUID automáticamente.
Ejecutamos el siguiente comando para que nos cree el Observer en app/Observers:
1 |
php artisan make:observer UserObserver |
Abrimos el archivo generado y añadimos el siguiente código:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
<?php namespace App\Observers; use App\Post; use Uuid; class PostObserver { public function creating(Post $post) { $post->uuid = Uuid::generate()->string; } } |
Un observer es un capturador de los eventos que lanzan los modelos de Eloquent en diferentes puntos de su ciclo de vida. Podrímos capturar un evento mientras se está eliminado el modelo, modificando… Aquí están todos los eventos que se pueden capturar. En este caso, es mientras se está creando (creating).
Ahora vamos a vincular el Observer creado al modelo Post. Creamos un Provider para los Observers:
1 |
php artisan make:provider ObserverProvider |
Y añadimos el siguiente código:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
<?php namespace App\Providers; use Illuminate\Support\ServiceProvider; class ObserverServiceProvider extends ServiceProvider { public function boot() { \App\Post::observe(\App\Observers\PostObserver::class); } ... } |
Y finalmente, añadimos el Provider al array de Providers del archivo de config/app.php:
1 2 3 4 5 6 |
... 'providers' => [ ... App\Providers\ObserverServiceProvider::class, ], ... |
Con esto ya estaría vinculado y cada vez que se cree un Post se le añadirá el UUID automáticamente.
Como podemos ver ya se crean automáticamente, yo he generado los posts con los seeders.
Ahora vamos a ver cómo hacer que la key de la ruta sea el UUID en vez del id incremental. Con esto conseguiremos ya lo que planteabamos al principio de la entrada, ocultar el id incremental del registro y, en cambio, mostrar el UUID.
Para hacer esto tendremos que añadir el siguiente código al modelo para indicarle que la key de la url será el UUID:
1 2 3 4 |
public function getRouteKeyName() { return 'uuid'; } |
Deberemos añadir o cambiar las rutas tanto en el archivo de rutas como en las vistas, para que en vez del id sea el UUID. Entonces, cuando bindeemos el modelo al método del controlador al haber añadido el método getRouteKeyName al modelo, ya obtendremos el modelo a partir del UUID, tal como pone en la documentación del paquete.
Y si accedemos a la ruta con el UUID, veremos el post al cual corresponda ese UUID: