Contenido del curso
Base de datos
Consultas a tablas
Sistema de inicio de sesión
Gestión de base de datos
Slugs automáticos con Doctrine en Symfony
Resumen
Trabajar con slugs automáticos en Symfony transforma URLs numéricas como /item/302 en direcciones legibles y profesionales. Si desarrollas con Doctrine y buscas mejorar SEO y semántica de tus rutas, esta integración resuelve el problema en pocos pasos.
¿Por qué reemplazar IDs por slugs en tus URLs?
Una URL con un número como 302 no comunica nada al usuario ni a los motores de búsqueda. Un slug, en cambio, describe el contenido y mejora la experiencia de navegación.
Antes de instalar nada, conviene simplificar el controlador. En lugar de inyectar el ID y hacer la consulta manual, puedes trabajar directamente con la entidad como parámetro. Doctrine se encarga de la consulta y, si el registro no existe, dispara automáticamente una excepción que devuelve un error 404 Not Found [01:00].
¿Qué es un slug en desarrollo web? Es una versión legible y amigable de una URL que reemplaza identificadores numéricos por texto descriptivo, normalmente derivado del título del recurso.
¿Cómo instalar la extensión de Doctrine para slugs?
La solución pasa por una extensión muy popular del ecosistema Symfony que añade comportamientos automáticos a Doctrine, incluyendo el manejo de campos slug.
Desde el terminal ejecutas el comando de instalación que aparece en la documentación oficial. Cuando el sistema pregunte si quieres ejecutar las recetas, respondes que sí: esto crea los archivos de configuración necesarios automáticamente [02:30].
Luego abres el archivo de configuración del paquete instalado y ajustas tres cosas:
- Activar
defaultconORM. - Marcar el comportamiento como
true. - Eliminar la sección de timestamps si no la usas.
¿Cómo añadir el campo slug a tu entidad?
Con el paquete listo, toca actualizar la entidad. Aquí aprovechas el comando make:entity para repasar el flujo completo de modificación.
Ejecutas bin/console make:entity, eliges actualizar la entidad existente y agregas un campo nuevo:
- Nombre:
slug. - Tipo:
string. - Longitud:
255. - Permitir nulos:
no.
Esto inyecta la propiedad y sus métodos getter/setter en la clase. El paso clave viene ahora: indicarle a Doctrine de dónde sacar el valor del slug. Sobre la propiedad slug agregas el atributo del proveedor con la configuración fields: ['title']. Así le dices que genere el slug a partir del título registrado en cada entidad [05:15].
¿Cómo se genera automáticamente un slug a partir del título? Mediante un atributo de la extensión Doctrine que escucha eventos de persistencia y convierte el título en una cadena URL friendly antes de guardar el registro.
¿Cómo migrar la base de datos sin romper tu entorno?
Cualquier campo nuevo no nulo exige una estrategia de migración. En producción tendrías que permitir nulos al inicio, poblar los datos y luego endurecer la regla. En desarrollo puedes ir directo.
Los comandos para reiniciar el entorno son:
doctrine:database:drop --forcepara borrar la base.doctrine:database:createpara volver a crearla.doctrine:migrations:migratepara ejecutar la migración generada.doctrine:fixtures:loadpara cargar los datos falsos de prueba.
Al actualizar la tabla, cada registro aparece con su nuevo campo slug poblado automáticamente gracias a la configuración previa de la entidad.
¿Cómo configurar el controlador para usar el slug?
Las plantillas que generan enlaces deben pasar slug en lugar de id al helper de rutas. Si dejas el ID, Symfony lanzará un error indicando que el campo esperado no coincide.
En el controlador, el método que recibía un ID ahora debe declarar el parámetro como slug. Pero aún falta algo: por defecto, Symfony intenta resolver la entidad por su clave primaria. Necesitas indicarle explícitamente con qué campo hacer la consulta usando el atributo MapEntity con la opción mapping: ['slug' => 'slug']. Esto le dice al param converter que busque el registro cuyo campo slug coincida con el valor de la URL.
¿Cómo verificar que las URLs funcionan correctamente?
Con todo conectado, recargas la página principal y los enlaces ahora apuntan a rutas como /item/mi-titulo-de-ejemplo. Al hacer clic, la consulta se resuelve por slug y la vista carga el detalle correcto.
Puedes incluso renombrar el segmento item de la ruta por algo más significativo según el dominio de tu proyecto. La barra de depuración en modo desarrollador te permite inspeccionar el slug generado y confirmar el comportamiento [09:40].
Reto: aplica slugs a tus módulos anteriores
Si vienes siguiendo el curso, ya construiste un blog con etiquetas y un sistema de productos con categorías. Te toca ahora aplicar esta misma técnica de slug automático con Doctrine en esos módulos.
La idea es que cada artículo, etiqueta, producto y categoría tenga su propia URL legible derivada del nombre o título. Eso mejora la apariencia, la semántica y el posicionamiento de cualquier proyecto.
Deja en los comentarios cómo te fue con la integración, qué decisiones tomaste sobre permitir nulos en producción y qué nombres usaste para tus segmentos de ruta.