📚 | TP 4 : Routeur
Différemment des TD, les TP doivent s'effectuer seul. Ainsi, la réponse que vous trouverez à la problématique peut différer d'un étudiant à l'autre.
Dans le cadre du développement d'une API REST, un routeur HTTP est un composant clé. Il permet de diriger les requêtes HTTP vers la bonne partie du code en fonction de l'URL demandée et de la méthode HTTP utilisée (GET, POST, PUT, DELETE, etc.). Ce système de routage est essentiel pour organiser les différentes routes d'une API REST, afin de bien structurer les opérations sur les ressources comme les utilisateurs, les articles, ou les produits.
Par exemple, mon endpoint (URL) POST /utilisateur
sera relié à ma fonction PHP createUser($request)
.
Faire le TP
1. Créer la structure du projet
- Séance 3/TP4/
autoloader.php
(voir ajouter un autoloader)routes.php
- Script retournant un simple tableau contenant toutes les routes définies. Par exemple :return [];
- public/
index.php
- Script qui réceptionnera toutes les requêtes HTTP entrantes et effectuera le routage
- framework/
Method.php
- String - Enumération des différentes méthodes HTTP- GET, POST, PUT ou DELETE
ResponseType.php
- String - Enumération des différents types de réponse- JSON, XML ou HTML
Response.php
- Classe PHP représentant une réponse HTTP- $type - ResponseType
- $content - String - contenu (corps) de la réponse
- $code - Int - code de retour
Route.php
- Classe PHP représentant une route- $method - Method
- $endpoint - String - URL du endpoint, par exemple : /users
- $controller - String - Nom de la classe du contrôleur associé, par exemple : si mon contrôleur s'appelle TestController je pourrais utiliser TestController::class
- $function - String - Nom de la fonction du contrôleur à appeler
- controllers/
MyTestController.php
- Classe PHP représentant une ressource REST. Cette classe ne contient QUE des fonctions ayant pour paramètrearray $request
et ne retournant quenew Response(...)
- Autres contrôleurs...
2. Ajouter un autoloader
Un autoloader est un fichier qui charge automatiquement toutes les classes PHP de votre code, simplifiant ainsi leur import et leur utilisation.
À la racine de votre projet, ajouter ce fichier :
<?php
/* Code from internet, automatically load classes if they are currently not loaded */
// https://www.php.net/manual/en/language.oop5.autoload.php
spl_autoload_register(function ($className) {
$filename = __DIR__ . DIRECTORY_SEPARATOR . str_replace('\\', '/', $className) . '.php';
if (file_exists($filename)) require_once($filename);
});
Pour utiliser l'autoloader, il suffira d'ajouter cette ligne au tout début de votre index.php
:
// Import the autoloader, which loads all the namespaces and classes
require(__DIR__ . '/../autoloader.php');
3. Lancer le serveur
Une fois à la racine de votre projet /Séance 3/TP4/
, il faut utiliser la commande suivante :
php -S localhost:8080 -t public
À noter que le dossier servi est public
et non TP4
. Cela permet d'avoir des accès utilisateurs différents, mon dossier public va être accessible par quasi-tout me monde (774). Là où mon dossier TP4 n'est accessible que par l'utilisateur courant (700).
Cependant, cela n'a pas d'importance dans notre TP
Informations utiles
- Utiliser l'autoloader : https://www.php.net/manual/en/language.namespaces.definition.php
- N'oubliez pas d'ajouter un namespace au début de vos classes et énumérations
- POO en PHP : https://www.php.net/manual/en/language.oop5.basic.php
- Enumérations typées en PHP : https://www.php.net/manual/en/language.enumerations.backed.php
- Importer une variable d'un autre fichier (
routes.php
) : https://www.php.net/manual/fr/function.require.php
Concernant le fichier index.php
Script qui réceptionnera toutes les requêtes HTTP entrantes et effectuera le routage.
Ce script devra ainsi, dans l'ordre :
- Charger l'autolaoder
- Importer le tableau des routes (
routes.php
), - Récupérer le endpoint et la méthode utilisées par le client
- Comparer toutes les routes définies à la requête du client (endpoint et m éthode identique)
- Si la route est identique
- Instancier le contrôleur (
$controller = new $route->controller;
) - Appeler la fonction du contrôleur (
$response = $controller->{$route->function}($_REQUEST);
) - Récupérer la réponse
- Instancier le contrôleur (
- Si la route n'est pas identique
- Créer une réponse 404
- Si la route est identique
- Ajuster les headers de la réponse (Code, Content-type)
- Renvoyer la réponse
Vous pouvez demander de l'aide si nécessaire.