Cómo Symfony conecta rutas, controladores y Twig

Resumen

¿Cómo responde Symfony a una solicitud web y cómo conectas una ruta con una vista renderizada? Aquí construyes ese flujo paso a paso: desde levantar el servidor hasta retornar una plantilla Twig con variables, más una herramienta de depuración que te muestra todo lo que ocurre por debajo. Ideal si estás dando tus primeros pasos con el framework y quieres entender la lógica controlador-ruta-vista sin magia oculta.

¿Cómo se inicia un proyecto Symfony en el navegador?

Todo arranca con el servidor local. Abres tu terminal dentro del proyecto básico y ejecutas symfony serve. Eso levanta el sistema en la dirección 127.0.0.1:8000, que es la ruta por defecto donde Symfony expone tu aplicación.

Cuando entras al navegador por primera vez, te aparece una vista que avisa algo así como: estás viendo esto porque no tienes un homepage configurado. Esa pantalla es una pista: el framework está vivo, pero falta que tú definas qué responder en la raíz.

¿Qué hace el comando symfony serve? Inicializa un servidor de desarrollo local en 127.0.0.1:8000 para que puedas visualizar tu proyecto Symfony en el navegador sin necesidad de configurar Apache o Nginx.

¿Cómo creo un controlador y una ruta en Symfony?

El punto de entrada lógico es el controlador. Vas a src/Controller, haces clic derecho y creas un archivo nuevo llamado PageController.php. Dentro defines el namespace App\Controller, que apunta a la carpeta src según la configuración de autoload del archivo composer.json.

Declaras la clase PageController y dejas un único método index. Para que Symfony sepa cuándo ejecutar ese método, le agregas un atributo de ruta justo encima:

php namespace App\Controller;

use Symfony\Component\Routing\Annotation\Route; use Symfony\Component\HttpFoundation\Response;

class PageController { #[Route('/', name: 'home')] public function index() { return new Response('Hola desde Symfony'); } }

Esa anotación #[Route('/', name: 'home')] le dice al framework: cuando alguien visite la raíz, dispara este método. El nombre home te servirá luego para referenciar la ruta desde otros lugares.

¿Por qué Symfony exige retornar un objeto Response?

Si intentas devolver una cadena de texto plana, el sistema te lanza un error claro: necesita un objeto del tipo Response. Esto no es capricho, es coherencia. Symfony trabaja con el ciclo request-response de HTTP, así que cada acción debe entregar una respuesta estructurada con cuerpo, encabezados y código de estado.

Por eso escribes new Response('texto') y se importa la clase desde Symfony\Component\HttpFoundation\Response.

¿Cómo renderizar una vista con Twig en Symfony?

Devolver texto crudo funciona, pero no es lo común. Lo natural es renderizar una plantilla. Para eso cambias el return por:

php return $this->render('page/home.html.twig', [ 'title' => 'Mi primera página' ]);

Para que $this->render() exista, tu controlador debe extender de AbstractController, la clase base de Symfony que te da utilidades como renderizado, redirecciones y acceso a servicios.

El primer error que verás es que Twig no viene instalado en el proyecto básico. Lo agregas con:

bash composer require twig

Esto descarga el paquete y crea la carpeta templates/ donde vivirán tus vistas.

¿Cómo se estructura una plantilla Twig que extiende de un layout base?

Dentro de templates/ creas la carpeta page/ y el archivo home.html.twig. La plantilla extiende del layout principal y sobrescribe bloques:

twig {% extends 'base.html.twig' %}

{% block title %}{{ title }}{% endblock %}

{% block body %} <h1>{{ title }}</h1> {% endblock %}

El archivo base.html.twig ya trae bloques predefinidos: title, body, e incluso espacios para hojas de estilo y archivos JavaScript. Tú solo rellenas lo que necesitas. La variable title que pasaste desde el controlador se imprime con la sintaxis {{ title }}.

Al actualizar el navegador, ves el título renderizado. El flujo completo es: visitas la raíz, se acciona el método index, se renderiza la vista page/home.html.twig y se le inyecta la variable title.

¿Cómo depurar un proyecto Symfony con la barra de profiler?

Aquí viene lo interesante. Symfony tiene una herramienta de depuración profesional que se instala con:

bash composer require debug

Después de eso, al actualizar el navegador aparece una barra inferior que te muestra en tiempo real qué está ocurriendo con tu proyecto. Algunos datos que entrega:

  • Estado HTTP de la respuesta, por ejemplo 200.
  • Controlador y método ejecutados, en este caso PageController::index.
  • Nombre de la ruta activa, home.
  • Versión del binario de Symfony instalada, 5.12.0.
  • Versión de PHP del entorno.
  • Versión del framework Symfony, 7.3.0.

¿Qué es el profiler de Symfony? Es una barra de depuración que muestra detalles de cada request: ruta ejecutada, controlador, vistas renderizadas, consultas, tiempos y rendimiento. Se activa instalando el paquete debug.

Al hacer clic en cualquier sección, accedes al profiler completo: detalles del request y response, sistema de rutas, plantillas utilizadas, rendimiento. Es la mejor forma de entender qué se está cargando y por qué.

¿Qué reto puedes hacer para practicar?

Crea una nueva página llamada Acerca de, redáctala con su propio controlador, ruta y plantilla Twig, y luego abre el profiler para inspeccionar qué ocurre en cada capa. ¿Qué descubriste al revisarlo? Cuéntalo en los comentarios.

      Cómo Symfony conecta rutas, controladores y Twig