Pratique index
Autre
Autre
Créer un exemple complet de requête et reponse simple en utilisant le composant HTTP Kernel en dehors d'un projet symfony.
use App\Controller\HelloController;
use Symfony\Component\EventDispatcher\EventDispatcher;
use Symfony\Component\HttpFoundation\ParameterBag;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\RequestStack;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpKernel\Controller\ArgumentResolver;
use Symfony\Component\HttpKernel\Controller\ControllerResolver;
use Symfony\Component\HttpKernel\EventListener\RouterListener;
use Symfony\Component\HttpKernel\HttpKernel;
use Symfony\Component\Routing\Matcher\UrlMatcher;
use Symfony\Component\Routing\RequestContext;
use Symfony\Component\Routing\Route;
use Symfony\Component\Routing\RouteCollection;
// Création d'une collection de routes (contiendra les différentes routes de l'application)
$routes = new RouteCollection();
// Ajout d'une route nommée 'blabla' avec le chemin '/blabla'.
// Elle est associée à un contrôleur sous forme de closure (fonction anonyme) qui renvoie une réponse 'Blabla'.
$routes->add('blabla', new Route('/blabla', [
'_controller' => fn(Request $request) => new Response('Blabla'),
]));
// Création d'un objet Request à partir des superglobales PHP ($_GET, $_POST, etc.).
$request = Request::createFromGlobals();
// Création d'un objet permettant de faire correspondre l'URL de la requête avec les routes définies.
$matcher = new UrlMatcher($routes, new RequestContext());
// Création d'un gestionnaire d'événements.
$dispatcher = new EventDispatcher();
// Ajout d'un listener qui écoute les événements liés au routage (RouterListener).
// Ce listener est responsable d'ajouter des informations de routage à la requête.
$dispatcher->addSubscriber(new RouterListener($matcher, new RequestStack()));
// Création d'un résolveur de contrôleurs permettant d'exécuter le bon contrôleur en fonction de la requête.
$controllerResolver = new ControllerResolver();
// Création d'un résolveur d'arguments pour récupérer les paramètres nécessaires à l'exécution du contrôleur.
$argumentResolver = new ArgumentResolver();
// Définition manuelle de l'attribut `_controller` dans la requête.
// Il indique quel contrôleur doit être appelé (ici `HelloController::index`).
$request->attributes = new ParameterBag(['_controller' => HelloController::class . '::index']);
// Création d'un objet contenant les paramètres du routage.
// `_controller` définit le contrôleur à exécuter.
// `_route` contient le nom de la route correspondante.
$parameters = new ParameterBag([
'_controller' => HelloController::class,
'_route' => 'index',
]);
// Création du noyau HTTP (HttpKernel) qui va gérer la requête et appeler le bon contrôleur.
// Il utilise le dispatcher pour gérer les événements et les erreurs,
// le résolveur de contrôleurs pour trouver le bon contrôleur,
// une pile de requêtes (RequestStack), et le résolveur d'arguments pour fournir les bons paramètres au contrôleur.
$kernel = new HttpKernel($dispatcher, $controllerResolver, new RequestStack(), $argumentResolver);
// Le noyau gère la requête et retourne une réponse.
$response = $kernel->handle($request);
// Envoi de la réponse au client (affichage du contenu HTML, JSON, etc.).
$response->send();
// Exécution des tâches de fin de requête (ex: fermeture de connexion, nettoyage de ressources).
$kernel->terminate($request, $response);