En este tutorial vamos a ver como generar una URL amigable con Laravel, ocultando el identificador para mejorar la seguridad de nuestro sitio.
La forma correcta de generar URL amigable con Laravel
La solución es tener un identificar dentro de la url que nos permita generar el contenido para la vista. Hay varias formas de estructurar nuestras url en Laravel. Una de ellas es poner el identificador (id) como un segmento de la url:
https://www.laraveltip.com/[id]/[slug]
Otra forma es que el identificar sea parte del slug poniéndolo al comienzo o al final del mismo:
https://www.laraveltip.com/[id]-[slug]
https://www.laraveltip.com/[slug]-[id]
¿Cuál es la forma correcta? No tengo la mas pu… idea! jajaj. Hay paginas de renombre como Stack Overflow, que utilizan la primer forma de url y otras como Medium, que ponen el identificador al final. Si hay un especialista SEO en la sala, que nos comente en la caja de comentarios cual es la mejor forma de hacerlo. Será agradecido. 😆
Vamos a utilizar la ultima estructura, identificador al final.
Determinando el identificador de la URL
¿Cuál va a ser el identificador de nuestra url en Laravel? Bien, suponiendo que estamos usando una base de datos relacional como MySQL, lo primero que pensamos es utilizar el ID de la tabla como identificador de la url:
https://www.laraveltip.com/este-es-mi-primer-articulo-sobre-laravel-1
Esto es correcto, pero no es buena idea exponer los ID de nuestras tablas. Por lo tanto, vamos a cambiar el ID por una cadena aleatoria única de 5 caracteres. Nuestras url quedarían algo así:
https://www.laraveltip.com/este-es-mi-primer-articulo-sobre-laravel-2d9jr
Creando la url de nuestros artículos con Laravel y Eloquent
Creando la Migración necesaria
Tip: agregar unique hace que la columna sea única y las búsquedas en la tabla serán mas rápidas.
Aclaración: La columna UUID no es un campo UUID como tal, ya que este tipo de datos son cadenas de 32 caracteres y es algo demasiado largo para nuestras urls. Nuestro UUID serán cadenas de 5 caracteres generados por nosotros.
Cómo crear el Modelo para nuestra URL
En nuestro modelo vamos a definir dos «atributos virtuales».
Un atributo para la url que nos servirá para utilizar en nuestras vistas. Está es la forma correcta de asignar una url a un modelo, de esta forma no tendremos que llamar a la función route en cada vista de nuestro sitio web.
Y otro atributo que arma el slug.
Trabajando con Observer para generar la URL
En el método creating del observer es donde vamos a generar nuestro uuid.
No me gusta que quede tanto código en el observer, así que vamos a enviar la lógica de generar una cadena única a otra clase llamada ArticleService.
Y así nos quedaría la clase Observer refactorizada. ¿Mucho mas limpia no?
Y ahora registramos el observer en nuestro archivo AppServiceProvider.php
Configurando nuestra Rutas
Como verán, puse al final la ruta que pertenece al controlador que maneja la vista de los artículos. Esto es muy importante porque si ponemos la ruta de la página del artículo primero que las paginas estáticas, Laravel interpretará a las paginas estáticas como paginas de artículos, redirigiendo las paginas estáticas al controlador ArticleController y es algo que no queremos.
En nuestro controlador vamos a extraer el identificador con la función substr y buscaremos el artículo haciendo uso del método firstOrFail para que arroje error 404 si no lo encuentra. Y por ultimo, devolvemos la vista con los datos del artículo.
🎁 Bonus: Evitando el contenido duplicado
Listo! Ya casi terminamos, lo único que nos falta es validar que dos url distintas pero con mismo identificador, no generen el mismo contenido. Por ejemplo:
Esta url:
https://www.laraveltip.com/mi-primer-articulo-1n5jo
Generará el mismo contenido que esta otra:
https://www.laraveltip.com/este-es-mi-primer-articulo-1n5jo
Google lo tomará como dos enlaces distintos pero con el mismo contenido y no es algo bueno para el SEO.
La solución va a ser sencilla, nada mas tenemos que validar que el titulo sin identificador que viene por parámetro sea igual al que nos devuelve la base de datos.
Retoquemos nuestro controlador:
Conclusión
De esta forma pudimos generar URL amigable en Laravel a pruebas de modificaciones. Además, tuvimos los cuidados necesarios para no tener enlaces rotos y contenido duplicado. Espero que les haya gustado y cualquier duda, déjenlas en los comentarios. Hasta la próxima. 😉🤙
Descarga desde Pakcagist.org este paquete cviebrock/eloquent-sluggable
Es tan fácil hacer los slug para tus aplicaciones y la documentación te lo dice todo. suerte y un abrazo desde Venezuela