¡Acceso ilimitado 24/7 a todos nuestros libros y vídeos! Descubra la Biblioteca Online ENI. Pulse aquí
¡Acceso ilimitado 24/7 a todos nuestros libros y vídeos! Descubra la Biblioteca Online ENI. Pulse aquí
  1. Libros
  2. Symfony 5
  3. Enrutamiento y controlador
Extrait - Symfony 5 Desarrolle sitios web PHP estructurados y eficientes
Extractos del libro
Symfony 5 Desarrolle sitios web PHP estructurados y eficientes Volver a la página de compra del libro

Enrutamiento y controlador

Cómo funciona el enrutamiento en Symfony

1. Definición

Como hemos vito en el capítulo sobre la arquitectura del framework, Symfony no utiliza la relación entre la URL y el sistema de archivos para servir páginas web.

Las URL se administran mediante enrutamiento (componente Router del framework). El papel de este componente es encontrar la acción que se debe realizar para una petición determinada y, para ello, se basa en un conjunto de reglas de enrutamiento definidas por el desarrollador.

Si está familiarizado con los sistemas de red, probablemente haya oído hablar de este término, o incluso del enrutador. En un contexto de aplicación, esto se corresponde con la acción seleccionada para una petición determinada; las acciones están contenidas en controladores en forma de métodos.

2. El directorio public y el controlador front

En la raíz del proyecto, tiene un directorio denominado public. Contiene todos sus archivos públicos. Por lo general, se trata de imágenes, hojas de estilo CSS, archivos de script JavaScript y, de manera más amplia, todos los archivos destinados a ser servidos directamente por el servidor web.

Para la URL http://midiario.local/robots.txt (o bien http://localhost:8000/robots.txt si está utilizando el servidor web integrado de PHP), se servirá el archivo robots.txt del directorio public.

Mientras que para...

Definir rutas

Una ruta es una regla de enrutamiento. Cada ruta se compone de diferentes reglas y apunta a una acción determinada.

Por defecto, el archivo de enrutamiento de la aplicación es config/routes.yaml, que se complementa con los archivos que se encuentran en config/routes/. En este último, encontramos principalmente el archivo annotations.yaml, que permite activar la configuración de enrutamiento a través de anotaciones:

controllers:  
   resource: ../../src/Controller/  
   type: annotation  
  
kernel:  
   resource: ../../src/Kernel.php  
   type: annotation 

1. Los diferentes formatos de definición

Como se mencionó en el capítulo Implementación de un proyecto Symfony, sección Estructura de la aplicación, hay diferentes formas de definir la configuración de una aplicación Symfony: a través de anotaciones o atributos PHP, pero también por medio de archivos de configuración. Hay varios formatos disponibles para los archivos de configuración: YAML (YAML Ain’t Markup Language), XML (eXtensible Markup Language) o PHP.

En cuanto al enrutamiento, se utilizan principalmente anotaciones o atributos PHP (si la aplicación funciona en PHP 8) y los archivos en formato YAML. En Symfony, por lo general, los formatos...

Configurar el path

1. El ejemplo /hello/world

La regla de enrutamiento más importante es el path, ya que se corresponde con la variable superglobal $_SERVER[’PATH_INFO’].

Configuremos una ruta para un path determinado: /hello/world.

Anotaciones o atributos de PHP

De acuerdo con las definiciones del capítulo Arquitectura del framework - El modelo de diseño MVC, las acciones son métodos de clase llamados «controladores» y, por lo tanto, por delante de estas acciones debemos colocar nuestra regla de enrutamiento como una anotación o un atributo:

namespace App\Controller;  
  
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; 
use Symfony\Component\HttpFoundation\Response;  
use Symfony\Component\Routing\Annotation\Route;  
  
class WelcomeController extends AbstractController   
{   
   /**   
    * @Route("/hello/world")   
    */   
   public function hello()   
   {   
       return new Response('Hello world!');   
   }   
} 

Con los atributos, usaríamos:

namespace App\Controller;  
  
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; 
use Symfony\Component\HttpFoundation\Response;   
  
class WelcomeController extends AbstractController  
{  
   #[Route("/hello/world")]  
   public function hello()  
   {  
       return new Response('Hello world!');  
   }  
} 

Tenga en cuenta que, con los atributos, no hay necesidad de usar ninguna directiva use para hacer visible una clase.

Aquí, la acción hello se ejecutará para cualquier petición cuyo path sea /hello/world. Esta regla de enrutamiento se define utilizando la anotación @Route o el atributo PHP.

Para que el enrutamiento del controlador sea efectivo, debe estar habilitado en el archivo config/routes/annotations.yaml. Para facilitar esta tarea, Symfony permite la configuración...

Enrutamiento por nombre de dominio

1. Requisitos previos

Hasta ahora hemos utilizado la URL para configurar nuestras rutas, pero también es posible usar el nombre de dominio.

Esta funcionalidad parece menos útil a primera vista porque un sitio web suele ser accesible a través de un solo nombre de dominio, pero principalmente permite la gestión de subdominios. Gracias a ella, el enrutador del framework puede interpretar de manera diferente los dominios www.example.com, admin.example.comes.example.com o mobile.example.com.

Esta técnica está muy extendida en la Web; el sitio se «divide» en varias partes autónomas:

  • secciones para smartphones/tabletas (por ejemplo, m.example.com, tableta.example.com o mobile.example.com),

  • secciones para los diferentes idiomas disponibles (por ejemplo, es.example.com o en.example.com),

  • secciones para cada área del sitio web (por ejemplo, admin.example.com o payment.example.com).

Esto también puede ser efectivo para los administradores de sitios web de publicación de contenido (por ejemplo, los blogs), donde podemos imaginar una zonificación por usuario, siendo el subdominio, por ejemplo, el nombre de usuario del miembro en cuestión (jean.example.com o lucia.example.com).

Antes de aventurarse en el enrutamiento de nombres de dominio, debe crear los diferentes subdominios que utiliza su sitio web. Este procedimiento se describe en el capítulo Implementación de un proyecto Symfony - Configurar el servidor web.

2. Ejemplo de implementación

Una vez que los subdominios están configurados a nivel del sistema, estará preparado para usar la función de enrutamiento de nombres de dominio.

Configuremos una ruta basada en el nombre de dominio, donde el subdominio corresponde al idioma del contenido:

YAML

# En el archivo config/routes.yaml   
   
mi_ruta:   
   path:     /hola/{name}   
   host:     "{_locale}.mi-proyecto.local"   ...

El controlador

Los controladores son elementos fundamentales porque contienen la lógica de su aplicación. Tienen varias funcionalidades que diferentes servicios ponen a su disposición.

Puede ver estas funcionalidades recorriendo la clase Symfony\Bundle\FrameworkBundle\Controller\AbstractController, de la que heredan sus controladores. Cada método llama a un servicio del Service Container, que son métodos que se corresponden con accesos directos.

1. Modelo de programación y reglas

Un controlador es una clase PHP que debe extender la clase Symfony\Bundle\FrameworkBundle\Controller\AbstractController. Esta herencia permite beneficiarse de mecanismos fuertes, como la búsqueda de servicios en el Service Container, así como la inyección de dependencias en los métodos. Más allá de esta restricción de herencia, las clases se deben nombrar con el sufijo Controller (WelcomeController, AdminController, etc.).

Las acciones del controlador son métodos de instancia públicos cuyo nombre es libre, al contrario de lo que sucede con las versiones anteriores del framework, donde tenían que terminar con el sufijo Action.

2. Trabajar con servicios

Todos los servicios son accesibles desde el controlador. Para acceder a él, simplemente invoque el método get(’id_del_servicio’).

public function index()   
{   
   $miServicio = $this->get('mi_servicio');   
   // Recupera el servicio cuyo identificador es 'mi_servicio' 
   // ...   
} 

Este método es capaz de recuperar tanto los servicios del framework como los servicios personalizados. Para obtener más información acerca de los servicios, vea Inyectar dependencias.

3. Utilizar los parámetros de sustitución

Hasta ahora, sus acciones eran métodos sin argumentos. Tenga en cuenta que Symfony dispone de una funcionalidad de «parámetros mágicos».

Si un parámetro tiene un nombre o un tipado de objeto particular, Symfony podrá inyectar un determinado valor (u objeto) durante la invocación de la acción. Por lo tanto, el código de la acción se aligera.

a. Parámetros de sustitución de rutas

Hemos usado esta funcionalidad previamente: cuando...