Créer des routes
Prise en main
Un site web de qualité utilise des adresses qui ont du sens, idéalement lisibles et élégantes. Grâce au système de route proposé par Laravel, des adresses du type /index.php?page=articles&id=123 sont aisément remplaçables par des adresses plus claires comme /articles/notre-histoire.
1. Définir une route
Ce chapitre se concentre sur le fichier routes/web.php qui contient les routes dédiées à l’application web. Mais une application Laravel possède par défaut plusieurs fichiers dans le dossier routes :
-
Le fichier routes/web.php pour les requêtes HTTP de la partie application web.
-
Le fichier routes/api.php pour les requêtes HTTP en tant qu’API : les routes sont stateless (le serveur ne créera pas de session pour ces routes) et avec des URI (identifiant de ressource uniforme, autrement dit la partie de l’adresse qui suit le nom de domaine) préfixés par /api.
-
Le fichier routes/console.php pour l’exécution de lignes de commandes.
-
Le fichier routes/channels.php pour les évènements avec l’usage du protocole WebSockets.
Les fichiers de route web.php et api.php sont chargés au niveau de la classe App\Providers\RouteServiceProvider. C’est dans cette classe que sont définis les traitements à exécuter pour toutes les routes d’un fichier de routes. On y trouve entre autres l’assignation de middlewares comme le gestionnaire de session pour le fichier web.php ou l’application d’un...
Paramètres des routes
1. Déclarer des paramètres
Il est parfois nécessaire de capturer certaines parties de l’URI d’une route pour ensuite la traiter. Par exemple, dans le cas d’un site de recettes de cuisine, il est nécessaire de capturer l’identifiant de la recette indiquée dans la barre d’adresse par le visiteur pour chercher la recette correspondante dans la base de données et la retourner :
-
Pour /recette/1, afficher la recette des tomates à la provençale.
-
Pour /recette/2, afficher la recette de la salade avocat-pamplemousse.
-
Pour /recette/3, afficher la recette du taboulé express.
-
etc.
Il paraît évident que les routes ne doivent pas être créées une par une pour chaque nouvelle recette ajoutée. Il faut donc utiliser des paramètres variables dans les routes.
Pour déclarer un paramètre variable dans l’URI d’une route, il faut utiliser des accolades autour du nom du paramètre. Au lieu d’écrire recette/1, recette/2 et recette/3 dans l’URI de la route, il faut écrire recette/{id}. Les paramètres déclarés doivent uniquement contenir des caractères alphabétiques et des tirets bas _ .
2. Utiliser les paramètres capturés
Pour traiter la variable capturée, il faut la passer en paramètre de la fonction de rappel de la route en lui donnant le même nom. Dans le code ci-dessous, une seule route est déclarée pour traiter toutes les recettes de la base de données.
Paramètre de route, fichier routes/web.php
Route::get(‘recette/{id}', function ($id) {
return ‘Identifiant de la recette :' . $id;
});
Le paramètre...
Réponses
1. Les types de réponses
Dans les exemples précédents, la fonction de rappel a toujours retourné une réponse sous la forme d’une chaîne de caractères : « Bienvenue chez Bonjour Taxi ! », « Gratuit pour les particuliers », etc.
Dans le détail, quand un visiteur déclenche l’exécution de ce code, c’est-à-dire en appelant la route en question dans son navigateur, la fonction de rappel renvoie le texte au framework. Ce texte est transmis au serveur qui le transmet à son tour au navigateur du client. Le client voit alors le texte affiché dans son navigateur.
Il existe cependant d’autres types de réponses.
Le système de réponse proposé par Laravel permet de retourner du texte, du HTML (grâce à un système de vue qui sera étudié au chapitre suivant) du JSON (dans le cas d’une création d’API REST par exemple) ou même des fichiers pour permettre un téléchargement.
Ainsi, la fonction response peut être utilisée dans les fonctions de rappel, bien que Laravel fournisse parfois quelques facilités qui permettent de s’en passer.
Dans le détail, la fonction response retourne un objet de type Illuminate\Http\Response. Cela permet au framework d’effectuer différentes opérations sur cet objet et permet par la suite aux développeurs d’appeler des méthodes sur cet objet. La classe Response de Laravel étend la classe Symfony\Component\HttpFoundation\Response de Symfony qui fournit de nombreuses méthodes mises à disposition dans l’objet.
2. Les réponses textuelles
Les réponses textuelles des exemples précédents ont été générées en retournant une chaîne de caractères à la fin de la fonction de rappel. C’est la méthode la plus simple pour effectuer...
Groupes de routes
1. Préfixes de routes
Lorsqu’une application web prend de l’ampleur, elle peut rapidement avoir plusieurs dizaines de routes, et certaines d’entre elles partagent des propriétés communes.
Par exemple, en créant une interface d’administration, la personne en charge du développement de l’application peut vouloir regrouper toutes les routes derrière un même chemin ayant pour préfixe /admin :
-
/admin/stats pour afficher des statistiques à l’administrateur.
-
/admin/users pour afficher la liste des utilisateurs.
-
/admin/users/123 pour afficher un utilisateur en particulier.
-
/admin/users/create pour afficher le formulaire de création d’un utilisateur.
-
/admin/logs pour afficher les logs de la plateforme.
-
Etc.
Il est bien entendu possible de créer toutes ces routes en les déclarant les unes à la suite des autres. Et c’est ce qu’il serait fait habituellement lors de la phase de conception :
Routes d’administration
Route::get('admin/stats', function () { /* ... */ });
Route::get('admin/users', function () { /* ... */ });
Route::get('admin/users/{id}', function ($id) { /* ... */ });
Route::get('admin/users/create', function () { /* ... */ });
Route::get('admin/logs', function () { /* ... */ });
Les groupes de routes permettent de déclarer une liste de routes partageant un préfixe commun (en l’occurrence admin) à l’aide des méthodes prefix et group. Pour éviter de répéter admin pour chacune des routes d’administration, il est possible de les organiser de la manière ci-dessous :
Routes...
Rate limiting (protection)
La fonctionnalité de rate limiting est utilisée pour restreindre le nombre d’appels possibles sur une route ou un ensemble de routes dans un laps de temps donné. Par défaut, Laravel utilise le rate limiting sur les routes du fichier routes/api.php pour qu’un utilisateur ne puisse pas faire plus de soixante appels par minutes sur l’API.
Configuration du rate limiting, classe App\Providers\RouteServiceProvider
protected function configureRateLimiting(): void
{
RateLimiter::for('api', function (Request $request) {
return Limit::perMinute(60)
->by($request->user()?->id ?: $request->ip());
});
}
Lorsque la limite est dépassée, Laravel génère automatiquement une réponse ayant comme statut de réponse 429. Dans l’exemple ci-dessus, la limitation s’applique pour chaque utilisateur car en paramètre de la méthode by, nous passons son identifiant (ou son adresse IP s’il n’est pas identifié).
Routes et vues
En résumé, les routes permettent de définir les adresses auxquelles répond une application Laravel et donc d’envoyer une réponse au visiteur qui se rend sur une page donnée.
On retiendra que les routes d’un site web sont définies par défaut dans un fichier routes/web.php, les URI sont déclarés sous la forme d’une chaîne de caractères et les réponses sont envoyées dans des fonctions de rappel.
Jusqu’à présent, les réponses envoyées ont été de simples messages de texte, parfois des objets JSON ou encore des morceaux de code HTML.
Le chapitre suivant introduit les vues, une notion centrale de Laravel avec le moteur de template Blade, qui permettent de renvoyer de véritables pages HTML dynamiques en fonction des routes définies.