Routes par attributs
Ce tutoriel vous montre comment simplifier la création de routes. Vous allez ainsi utiliser le même système que les professionnels du Web qui utilisent Symfony.
-
On commence par rajouter un paquet
composer require symfony/config
-
Puis on rajoute une classe
AttributeRouteControllerLoader
danssrc/Lib
:// src/Lib/AttributeRouteControllerLoader.php <?php namespace TheFeed\Lib; use Symfony\Component\Routing\Loader\AttributeClassLoader; use Symfony\Component\Routing\Route; class AttributeRouteControllerLoader extends AttributeClassLoader { /** * Configures the _controller default parameter of a given Route instance. */ protected function configureRoute(Route $route, \ReflectionClass $class, \ReflectionMethod $method, object $annot): void { $route->setDefault('_controller', $class->getName().'::'.$method->getName()); } }
-
Enfin, dans
RouteurURL.php
, on remplace toute la création des routes danstraiterRequete
par :use Symfony\Component\Config\FileLocator; use Symfony\Component\Routing\Loader\AttributeDirectoryLoader; use TheFeed\Lib\AttributeRouteControllerLoader; $fileLocator = new FileLocator(__DIR__); $attrClassLoader = new AttributeRouteControllerLoader(); $routes = (new AttributeDirectoryLoader($fileLocator, $attrClassLoader))->load(__DIR__);
-
Les routes se créent maintenant avec la syntaxe simplifiée suivante :
use Symfony\Component\Routing\Attribute\Route; class ControleurPublication extends ControleurGenerique { #[Route(path: '/publications', name:'afficherListe', methods:["GET"])] public static function afficherListe(): Response { // ... } }
On retrouve le
path
, le nom de la route (pour les appels à$generateurURL->generate()
) et les méthodes autorisées.Le tableau qui associait
_controller
à"\TheFeed\Controleur\ControleurUtilisateur::afficherListe"
sera rajouté par la méthode ci-dessusAttributeRouteControllerLoader::configureRoute
, qui elle-même sera appelée dans le mécanisme deAttributeDirectoryLoader
de Symfony.