Consultas a base de datos con repositorios en Symfony

Resumen

Mostrar datos reales en una vista Symfony exige conectar el controlador con la base de datos mediante el patrón repositorio. Aquí descubres cómo inyectar un repositorio, ejecutar consultas con findAll y find, y renderizar la información en plantillas Twig de forma dinámica, ideal si trabajas con PHP y Symfony.

En la clase anterior las vistas mostraban datos estáticos. Ahora el objetivo es claro: que cada snippet, comentario y autor venga directo de la base de datos.

¿Qué es el patrón repositorio en Symfony y por qué usarlo?

Cuando creas una entidad, Symfony genera bastante código por ti. Pero si metes las consultas dentro de la entidad, ese archivo crece sin control: en este caso ya superaba las 200 líneas. Ahí entra el patrón repositorio.

El repositorio es un archivo adicional pensado exclusivamente para alojar las consultas a base de datos. Symfony lo trae por defecto e incluso te deja un par de ejemplos comentados para que vayas construyendo tus propios métodos.

¿Qué es el patrón repositorio? Es un archivo separado donde guardas las consultas a base de datos relacionadas con una entidad. Mantiene la lógica de acceso a datos fuera de la entidad y del controlador.

¿Cómo inyectar el repositorio en el controlador y traer los datos?

Todo el flujo arranca en PageController. La ruta home apunta a una vista, y la idea es que antes de renderizarla se ejecute una consulta y los resultados viajen a la plantilla [01:05].

Para traer todos los registros, el método por defecto es findAll. Como devuelve muchos registros, conviene guardar el resultado en una variable en plural, por ejemplo snippets. Luego esa variable se pasa a la vista.

Para traer un único registro por ID, usas el método find apoyándote en el parámetro que llega por la ruta. Si el registro no existe, se lanza una excepción para evitar errores silenciosos. Como es un solo registro, la variable va en singular: snippet.

  • Inyecta el repositorio en el método del controlador.
  • Ejecuta findAll para listados o find con el ID para un detalle.
  • Pasa la variable a la vista junto con un título dinámico obtenido del propio registro.

¿Cuál es la diferencia entre findAll y find en Symfony? findAll devuelve todos los registros de la tabla. find recibe un ID y devuelve un único registro, o lanza una excepción si no existe.

¿Cómo renderizar los datos en Twig con for, filtros y condicionales?

La plantilla home.html.twig es donde se vuelve dinámico todo lo que antes estaba escrito a mano. El primer cambio es iterar sobre la consulta con un bloque for.

Iterar registros con for in

La sintaxis arranca con {% for snippet in snippets %} y cierra con {% endfor %}. Dentro del bloque puedes acceder a cualquier campo del registro con notación de punto: snippet.title, snippet.description, snippet.author.name, snippet.code.

Pluralizar con condicionales y contar con length

El conteo de comentarios usa el filtro length sobre la colección: comments|length. Para que el texto suene natural, un condicional ajusta el singular y el plural: si el total es igual a 1, imprime comentario; en cualquier otro caso, comentarios. Así cubres cero, uno, dos o más sin romper la gramática.

Construir rutas dinámicas con parámetros

La ruta de detalle fallaba porque le faltaba el ID. La corrección es pasar un objeto con el parámetro: { id: snippet.id }. Con eso el enlace queda funcional y al actualizar el navegador los conteos aparecen correctos: cuatro comentarios, tres comentarios, dos comentarios, según el registro [08:30].

¿Cómo mostrar el detalle de un snippet y sus comentarios?

En la vista del ítem se imprime el título, la descripción, el nombre del autor a través de la relación author.name, y el contenido del campo code. Para los comentarios se replica la estructura for recorriendo la colección de comentarios del snippet, mostrando autor y contenido en cada iteración.

Un detalle visual: el bloque de código necesita la clase whitespace-pre para respetar saltos de línea y espacios, ya que el sistema de CSS está activo y formatea el contenido.

¿Cómo accedo a una relación entre entidades en Twig? Con notación de punto. Si un snippet tiene un autor, escribes snippet.author.name y Twig resuelve la relación automáticamente.

¿Por qué aparecen 61 consultas en el home y qué sigue?

Al revisar el panel de Symfony, el home dispara 61 consultas a la base de datos. Es una señal clara de que algo se puede optimizar, probablemente un problema de consultas N+1 generado por las relaciones cargadas en cada iteración.

Por ahora lo importante es que la información ya es real y se imprime correctamente desde la base de datos. La optimización para evitar consultas innecesarias queda como siguiente paso.

¿Tú cómo organizas tus repositorios cuando un proyecto Symfony empieza a crecer? Cuéntame en los comentarios.