Cómo saber el controlador que maneja una ruta en Symfony

El framework Symfony es de lo mejorcito que tenemos en el mundillo de PHP (Personalmente es mi favorito por lejos).

Para procesar un request se requiere un método de alguna clase (Un controlador).

Para decidir cuál es el controlador al que se debe invocar al momento de responder al pedido de un usuario se utiliza un componente llamado Router.

Este componente conoce el mapeo entre una URI y dicho controlador.

Existen diversos modos de definir este mapeo (por ejemplo mediante annotations).

Esto hace que, si una aplicación es grande, puede ser algo complejo encontrar cuál es exactamente el controlador que se esconde detrás de una URL.

En este artículo te mostraré un pequeño truco para obtener esa información.

Voy a asumir que estás en algún tipo de consola POSIX (Linux, BSD, Mac o algo como el WSL de Windows).

Cómo debugear el mapa de ruteo de Symfony

Algo que seguramente conoces si usas Symfony es el poderoso comando (¿o debería llamarle meta-comando?) console.

A través de esta interface es posible realizar una gran cantidad de tareas (e incluso implementar las tuyas).

En esta ocasión quiero mostrarte un uso algo poco frecuente: el comando debug:router.

Usando este comando puedes ver un listado completo de las rutas definidas en tu proyecto, sin importar si están definidas usando YAML, XML, PHP o annotations.

Particularmente, si necesitas conocer la ruta que corresponde con una URL puedes usar la herramienta grep y un pipe, de esta forma:

php bin/console debug:router -e prod | grep PARTE_URL

Por ejemplo, digaos que necesitas conocer la ruta correspondiente a /admin/export/instant/.

El comando que puedes utilizar es:

php bin/console debug:router -e prod | grep export

Y obtuve este resultado:

Mapa de rutas definidas en la aplicación

Una vez allí es fácil obtener el nombre de la ruta que buscas: oro_importexport_export_instant

Cómo obtener el detalle de una ruta de Symfony

Claro que con ese dato tienes apenas la punta del iceberg.

Para obtener el detalle debes pasar como parámetro al comando el nombre de la ruta, por ejemplo:

php bin/console debug:router -e prod oro_importexport_export_instant

Y obtendrás un resultado similar a:

Detalle de una ruta de Symfony

Cómo encontrar el archivo donde está definido un controlador Symfony

Y ahora que sabes cuál es el controlador es fácil llegar al archivo que lo define… ¿cierto? Pues… depende.

Como decía, en el supuesto de una aplicación de mediana o gran envergadura, es probable que estés utilizando muchos bundles, con lo cual el controlador puede estar definido en varios lugares.

Una forma simple de llegar a este dato es usar el comando find, por ejemplo:

find vendor -type f  -name ImportExportController.php

Y ahora sí, combinando esta información con la obtenida en el comando anterior es posible ver el código exacto del método que responde a esta petición.

Nota al pié: este último paso puede simplificarse mucho si utilizas algún buen IDE para PHP 😉

mchojrin

Por mchojrin

Ayudo a desarrolladores PHP a acceder mercados y clientes más sofisticados y exigentes

¿Te quedó alguna duda? Publica aca tu pregunta

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.