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.