Curso Práctico de Symfony

Slugs automáticos con SlugField en EasyAdmin

Curso Práctico de Symfony

Contenido del curso

Administración

Slugs automáticos con SlugField en EasyAdmin

Resumen

Generar slugs automáticos en Symfony deja de ser un problema cuando aprovechas el campo SlugField de EasyAdmin junto con lógica personalizada en tus factories. Esta guía te muestra cómo transformar datos manuales en datos cercanos al mundo real para categorías y publicaciones.

¿Por qué automatizar la creación de slugs en EasyAdmin?

Cuando creas una categoría o publicación desde el panel administrativo, escribir el slug a mano rompe el flujo y abre la puerta a inconsistencias. Lo natural es que el slug se derive del nombre o del título, sin que tú tengas que pensarlo.

En el formulario por defecto, el slug aparece como un campo de texto cualquiera. El resultado: slugs que no coinciden con el nombre, formatos incoherentes y datos falsos que no reflejan un escenario real.

¿Qué es un slug? Es la versión amigable de una URL, normalmente en minúsculas y con guiones en lugar de espacios. Por ejemplo, tutorial-de-symfony en vez de Tutorial de Symfony.

¿Cómo configurar el SlugField en publicaciones y categorías?

El primer paso es importar la clase SlugField y reemplazar el campo de texto por uno que genere el slug a partir de otro campo del formulario.

En el crud controller de publicaciones, sustituye el campo de texto del slug por:

php SlugField::new('slug')->setTargetFieldName('title');

Esto le indica a EasyAdmin que tome el valor del campo title y lo transforme automáticamente en un slug válido [04:15]. Cuando escribas algo como tutorial D en el título, el slug se rellenará solo.

En el caso de las categorías, repite la operación pero apuntando al campo name:

php SlugField::new('slug')->setTargetFieldName('name');

No elimines el campo de texto del nombre, porque ese sí debe seguir siendo un text field normal. Solo cambias el del slug.

¿Cómo escribir lógica personalizada en un Factory de Doctrine?

Los factories generan datos falsos para poblar la base de datos en desarrollo. El problema es que, por defecto, el slug y el nombre pueden no tener relación entre sí. La solución es construir el slug dentro del propio factory.

En el factory de categorías, guarda el nombre en una variable y deriva el slug con funciones nativas de PHP:

php $name = self::faker()->unique()->word(); $slug = str_replace(' ', '-', strtolower($name));

La función strtolower convierte el texto a minúsculas y str_replace cambia los espacios por guiones. Como un word de Faker es una sola palabra, conviene usar unique() para evitar duplicados, ya que la probabilidad de repetición es alta cuando trabajas con palabras sueltas [06:50].

¿Por qué usar unique en categorías y no en publicaciones? Porque las categorías se generan con una sola palabra y se repiten fácilmente. Los títulos de publicaciones son oraciones completas, así que la probabilidad de colisión es mínima.

¿Cómo aplicar la misma lógica a las publicaciones?

En el factory de publicaciones, repites el patrón pero sobre el título:

php $title = self::faker()->sentence(); $slug = str_replace(' ', '-', strtolower($title));

Aquí no necesitas unique() porque cada oración generada por Faker es prácticamente irrepetible. La idea es que el slug refleje fielmente el contenido del título, igual que ocurre en un blog real.

¿Cómo recargar los datos falsos para validar los cambios?

Una vez configurados los factories, recarga la base de datos con el comando de Doctrine para fixtures:

bash php bin/console doctrine:fixtures:load

Responde a la confirmación y deja que el comando termine. Al revisar el panel de categorías verás slugs coherentes con cada nombre, y en publicaciones el slug seguirá fielmente al título.

¿Qué hace doctrine:fixtures:load? Vacía la base de datos y la vuelve a llenar con los datos generados por tus factories. Úsalo solo en entornos de desarrollo.

Algunos puntos clave para que todo funcione correctamente:

  • Importa SlugField desde el namespace de EasyAdmin antes de usarlo.
  • Usa setTargetFieldName apuntando al campo exacto del formulario.
  • Aplica strtolower antes de str_replace para asegurar el formato.
  • Añade unique() en Faker cuando trabajes con palabras sueltas.
  • Recarga las fixtures cada vez que modifiques la lógica del factory.

Con estos cambios, tu sistema deja de pedirte slugs manuales y empieza a comportarse como una aplicación real. Cuéntame en los comentarios qué otra lógica personalizada has añadido a tus factories de Doctrine.