Generar urls usando routes.yml y annotations

Video de Youtube
URL de Video remoto
Texto

Si no ves el video, puedes refrescar el navegador, presionando (Ctrl+Shift+R | Ctrl+F5 o Shift+F5), o abrirlo directamente desde el Canal de Youtube... HAZ CLIC AQUI

    Uno de los aspectos fundamentales dentro de cualquier proyecto web, está formado por la manera en que podremos generar o manipular las diferentes urls, que permiten entre otras cosas, el acceso a todas las secciones de la web, indexación del contenido en los buscadores o interactuar con los resultados de nuestra base de datos y/o formularios, mediante el envio de parámetros.

     Ya que hemos aprendido a utilizar el paquete (Bundle) Make, para generar un controlador, con su respectiva página, en el artículo anterior Symfony, Arquitectura y primeros pasos; hoy vamos a explorar las diferentes opciones disponibles en Symfony para generar estas urls.

     En Symfony 5 contamos con dos maneras para crear nuestras propias urls, mediante el uso del archivo routes.yml, que nos viene por defecto, al descargar el esqueleto del proyecto, y que está ubicado a nivel de nuestra carpeta raiz, dentro de la carpeta config, o mediante el paquete (Bundle) Annotation, que tendríamos que descargar utilzando el gestor de paquetes Composer, pero que ya nos viene descargado y listo si optamos por utilizar Lando como hemos echo en este caso.

   Cómo generar urls usando el archivo routes.yml

     El archivo routes.yml tiene como contenido, un modelo base, para que podamos copiar y modificar sus líneas, adaptádolas a nuestras necesidades. Si abrimos el archivos routes.yml, veremos una estructura como la siguiente:

#index:
#    path: /
#    controller: App\Controller\DefaultController::index

     Para que este archivo comience a funcionar, bastaría con descomentar todas sus líneas borrando las almohadillas (#) y asegurándonos de que existiera el controlador llamado DefaultController, con su respectivo método, función o acción, como le llaman en Symfony, con el nombre index.

     Explicación de la estructura

     #index: Se refiere al nombre interno que utiliza Symfony, para identificar esta url. Dicho nombre puede ser aleatorio, por lo que su contenido en realidad no impediría acceder a la respectiva página, siempe que rellenemos correctamente las líneas siguientes.

     # path: /: Esta sí que tiene un impacto directo, ya que es donde se define la ruta, a la cual podremos acceder desde el navegador, si queremos encontrar la página dentro de nuestro proyecto. En esta caso en particular, la barra hace referencia a la página principal de nuestro proyecto de Symfony, que sería la página por defecto que vimos al terminar la instalación y arrancar nuestro proyecto.

Curso Symfony 5 | www.drupaladicto.com - Consultor especializado en drupal y symfony

     # controller: App\Controller\DefaultController::index: En esta última línea es donde especificamos la ruta, para acceder hasta el controlador que conecta con nuestra página y a su vez, al método o acción dentro de él. Es muy importante poner atencion en la nomenclatura respectanto las mayúsculas en cada caso y los dos puntos, que permitirán ejecutar el método o acción relacionado.

   Ejercicio de comprobación

     Queremos asegurarnos de que hemos comprendido el funcionamiento del archivo routes.yml, por esta razón, vamos a realizar una prueba en la cual utilizaremos el MainController.php para convertir la página que generamos en el anterior capítulo, en la nueva página principal de nuestro proyecto.

     Para ello, abriremos nuestro controlador y comentaremos las líneas siguientes:

/*
/**
 * @Route("/main", name="app_main")
 */

     Estas líneas son las encargadas de generar la url para nuestro MainController, gracias al paquete (Bundle) Annotation, que explicaremos en breve, por ahora, lo único que necesitaremos es añadir la barra con el asterisco ( /* ) al principio de las líneas, para convertirlo en un comentario de php en lugar de una anotación.

     A continuación, abriremos el archivo routes.yml, borraremos todas las almohadillas y luego actualizaremos el nombre del controlador a MainController, en lugar de DefaultController, para que podamos utilizar nuestro controlador como ruta hacia nuestra página. El archivo routes.yml debería quedar de la siguiente manera:

index:
    path: /
    controller: App\Controller\MainController::index

     Una vez realizados los cambios, nos aseguraremos de guardarlos y si refrescamos el navegador, deberíamos ver que ahora la página principal de nuestro proyecto es la que habíamos generado.

Curso Symfony 5 | www.drupaladicto.com - Consultor especializado en drupal y symfony

  Cómo generar urls usando annotations

     Ahora que ya hemos comprobado cómo podemos configurar las urls, utilizando el archivo routes.yml, vamos a conocer la manera recomendada por Symfony, ya que permite mantener unidas en un mismo espacio, las principales configuraciones del controlador, junto a la gestión de sus url, gracias a su bundle Annotations o anotaciones.

     A primera vista, podemos darnos cuenta de que el aspecto de las anotaciones nos recuerda a los comentarios en php, pero en realidad es una estructura innovadora que nos permitirá incluir varias informaciones y/o parámetros sin la necesidad de buscar en otro lugar fuera del controlador, facilintando la investigacion y comprobación de errores.

     Antes de continuar, nos aseguraremos de restaurar el archivo routes.yml a su aspecto anterior, con las almohadillas y luego quitaremos el asterisco y la barra que habíamos añadido a nuestro MainController.php, quedando de la siguiente manera:

class MainController extends AbstractController
{
    /**
     * @Route("/main", name="app_main")
     */

     Si prestamos atención, y comparamos con el contenido de archivo routes.yml, encontraremos varias similitudes, que nos permitirán entender mejor el uso de anotaciones.

     En lo primero que deberíamos fijarnos al trabajar con las anotaciones es que sus líneas comienzan con una barra y dos asteriscos ( /** ) a diferencia de los comentarios de php y que terminan igual que estos, con un solo asterisco y una barra ( */ ). El resto de líneas que aparezca dentro de este principio y final de la estructura, será lo que conoceremos como anotaciones.

     En este ejemplo en concreto, para definir nuestra ruta, Symfony utiliza la siguiente declaración @Route( ) y dentro de los paréntesis, se añaden algunos elementos, dependiendo del propósito de dicha ruta.

     La primera parte, donde vemos las comillas dobles y el nombre main "/main", estamos definiendo el equivalente al path:, en el anterior archivo routes.yml, es decir, la url que pondremos en el navegador, para acceder a nuestra página.

     A continuación, en el apartado de name="app_main", como habrás imaginado, es el nombre de nuestra ruta, es decir, el equivalente a la primera línea dentro del archivo routes.yml, ese nombre interno que utiliza Symfony para identificar a la ruta, pero que no repercute directamente en que nuestra página se muester cuando escribimos su url en el navegador.

   Ejercicio de comprobación

     Como estamos comenzando con Symfony y para aprender a utilizarla correctamente, es recomendable que comprobemos cada nueva fase, para asegurarnos de que entendemos lo que estamos leyendo, vamos a realizar una rápida comprobarción, sobre el impacto que tendría en nuestra controlador, si modificamos el nombre en la declaración de la ruta.

/**
 * @Route("/main", name="otronombre")
 */

     Una vez hayamos realizado y guardado el cambio, accederemos nuevamente a la url correspondiente a nuestro controlador, que como puedes comprobar en este caso será /main y podrás ver en tu pantalla, que la página sigue mostrándose sin ningún cambio, a pesar de que has cambiado su nombre (NO SU RUTA).

Curso Symfony 5 | www.drupaladicto.com - Consultor especializado en drupal y symfony

     Felicidades!!! ya puedes presumir de que haz aprendido y entiendes cómo funciona la generación de urls en Symfony. Ahora, ¿te atreves a experimentar creando una nueva página, utilizando las anotaciones sin la necesidad de salir del archivo MainController.php?