Custom Route Loader en Symfony

imagen ordenador
Solucionex
03
Abr 25

Para la mayor parte de las aplicaciones que desarrollamos el comportamiento por defecto del sistema de enrutamiento de Symfony funciona perfectamente, ahora bien hay algunas situaciones en las que nuestras necesidades van más allá como es el caso de SonataAdminBundle, que crea rutas en base a convenciones CRUD.

Para estos casos existe la posibilidad de añadir un Custom Route Loader, que nos va a permitir definir rutas en nuestra aplicación mediante código PHP.

Definiendo rutas de manera programática

Básicamente Symfony carga una serie de Cargadores que implementan LoaderInterface, que les obliga a implementar 2 métodos:

  • load que va a devolver RouteCollection
  • supports que va a recibir el tipo de anotación configurada y va a devolver si es la adecuada

En src/Routing/CustomLoader.php

<?php

namespace App\Routing;
use Symfony\Component\Config\Loader\Loader;
use Symfony\Component\Routing\Route;
use Symfony\Component\Routing\RouteCollection;

class CustomLoader extends Loader
{
   public function load($resource, ?string $type = null): RouteCollection
   {
       $routes = new RouteCollection();
       // New route
       $path = '/custom/{parameter}';
       $defaults = [
           '_controller' => 'App\Controller\CustomController::customMethod',
       ];
       $routes->add('custom_route', new Route($path, $defaults));
       return $routes;
   }

   public function supports($resource, ?string $type = null): bool
   {
       return 'custom' === $type;
   }
}

Asegurate de que el metodo que le has pasado en _controller existe

En config/services.yaml configuramos el servicio indicándole que es un routing_loader

   App\Routing\CustomLoader:
       tags: [routing.loader]

Y en config/routes.yaml

custom_routes:
   resource: .
   type: custom

Aquí lo que importa es el parámetro type que es el que se va a pasar al método supports de nuestra clase y que activará nuestro Loader.

+Info

symfony