Maîtriser les itinéraires de Laravel

Publié: 2022-12-12

En ce qui concerne le backend, les développeurs finissent par rencontrer des itinéraires. Les routes peuvent être considérées comme l'épine dorsale du backend puisque chaque requête reçue par le serveur est redirigée vers un contrôleur via une liste de routage qui mappe les requêtes aux contrôleurs ou aux actions.

Laravel nous cache de nombreux détails d'implémentation et contient beaucoup de sucre syntaxique pour aider les développeurs débutants et expérimentés à développer leurs applications Web.

Examinons de près comment gérer les itinéraires dans Laravel.

Routage backend et script intersite dans Laravel

Sur un serveur, il existe des routes publiques et privées. Les routes publiques peuvent être une source de préoccupation en raison de la possibilité de scripts intersites (XSS), un type d'attaque par injection qui peut vous rendre, vous et vos utilisateurs, vulnérables aux acteurs malveillants.

Le problème est qu'un utilisateur peut être redirigé d'une route qui ne nécessite pas de jeton de session vers une route qui en a besoin — et il aura toujours accès sans le jeton. Cliquez pour tweeter

Le moyen le plus simple de résoudre ce problème est d'appliquer un nouvel en-tête HTTP, en ajoutant "référent" à la route pour atténuer ce scénario :

 'main' => [ 'path' => '/main', 'referrer' => 'required,refresh-empty', 'target' => Controller\DashboardController::class . '::mainAction' ]

Routage de base de Laravel

Dans Laravel, les routes permettent aux utilisateurs d'acheminer la demande appropriée vers le contrôleur souhaité. La route Laravel la plus basique accepte un identifiant d'actif uniforme (votre chemin de route) et une fermeture qui peut être à la fois une fonction ou une classe.

Dans Laravel, les routes sont créées dans les fichiers web.php et api.php . Laravel est livré avec deux routes par défaut : une pour le WEB et une pour l'API.

Ces routes résident dans le dossier routes/ , mais elles sont chargées dans le fichier Providers/RouteServiceProvider.php .

Une ligne de commande montrant l'état par défaut du fournisseur de services d'itinéraire de Laravel.
État par défaut du fournisseur de services d'itinéraire de Laravel.

Au lieu de faire cela, nous pouvons charger les routes directement dans RouteServiceProvider.php , en sautant le dossier routes/ .

Une fenêtre de ligne de commande montrant le chargement des routes Laravel directement dans le fournisseur.
Chargement des routes Laravel directement dans le fournisseur.

Redirections

Lorsque nous définissons une route, nous voulons généralement rediriger l'utilisateur qui y accède, et les raisons varient beaucoup. C'est peut-être parce qu'il s'agit d'une route obsolète et que nous avons changé le backend ou le serveur, ou parce que nous voulons installer une authentification à deux facteurs (2FA), etc.

Laravel a un moyen simple de le faire. Grâce à la simplicité du framework, nous pouvons utiliser la méthode redirect sur la façade Route, qui accepte la route d'entrée et la route vers laquelle être redirigé.

En option, nous pouvons donner le code d'état de la redirection comme troisième paramètre. La méthode permanentRedirect fera la même chose que la méthode redirect , sauf qu'elle renverra toujours un code d'état 301 :

 // Simple redirect Route::redirect("/class", "/myClass"); // Redirect with custom status Route::redirect("/home", "/office", 305); // Route redirect with 301 status code Route::permanentRedirect("/home", "office");

À l'intérieur des routes de redirection, il nous est interdit d'utiliser les mots-clés "destination" et "status" comme paramètres car ils sont réservés par Laravel.

 // Illegal to use Route::redirect("/home", "/office/{status}");

Vues

Les vues sont les . fichiers blade.php que nous utilisons pour rendre l'interface de notre application Laravel. Il utilise le moteur de modèles de lame et constitue le moyen par défaut de créer une application complète en utilisant uniquement Laravel.

Si nous voulons que notre route renvoie une vue, nous pouvons simplement utiliser la méthode view sur la façade Route. Il accepte un paramètre de route, un nom de vue et un tableau facultatif de valeurs à transmettre à la vue.

 // When the user accesses my-domain.com/homepage // the homepage.blade.php file will be rendered Route::view("/homepage", "homepage");

Supposons que notre vue veuille dire "Hello, {name} " en passant un tableau optionnel avec ce paramètre. Nous pouvons faire exactement cela avec le code suivant (si le paramètre manquant est requis dans la vue, la requête échouera et générera une erreur) :

 Route::view('/homepage', 'homepage', ['name' => "Kinsta"]);

Liste des itinéraires

Au fur et à mesure que votre application grandit, le nombre de requêtes à acheminer augmente également. Et avec un grand volume d'informations peut venir une grande confusion.

C'est là que la artisan route:list command peut nous aider. Il fournit une vue d'ensemble de toutes les routes définies dans l'application, de leurs intergiciels et de leurs contrôleurs.

 php artisan route:list

Il affichera une liste de toutes les routes sans les middlewares. Pour cela, nous devons utiliser le drapeau -v :

 php artisan route:list -v

Dans une situation où vous utilisez peut-être une conception pilotée par domaine où vos routes ont des noms spécifiques dans leurs chemins, vous pouvez utiliser les capacités de filtrage de cette commande comme suit :

 php artisan route:list –path=api/account

Cela n'affichera que les routes qui commencent par api/account .

D'autre part, nous pouvons demander à Laravel d'exclure ou d'inclure des routes définies par des tiers en utilisant les options –except-vendor ou –only-vendor .

Paramètres d'itinéraire

Parfois, vous devrez peut-être capturer des segments de l'URI avec la route, comme un ID utilisateur ou un jeton. Nous pouvons le faire en définissant un paramètre de route, qui est toujours entouré d'accolades ( {} ) et ne doit être composé que de caractères alphabétiques.

Si nos routes ont des dépendances à l'intérieur de leurs rappels, le conteneur de service Laravel les injectera automatiquement :

 use Illuminate\Http\Request; use Controllers/DashboardController; Route::post('/dashboard/{id}, function (Request $request, string $id) { return 'User:' . $id; } Route::get('/dashboard/{id}, DashboardController.php);

Paramètres requis

Les paramètres requis de Laravel sont des paramètres dans les routes que nous ne sommes pas autorisés à ignorer lorsque nous passons un appel. Sinon, une erreur sera renvoyée :

 Route::post("/gdpr/{userId}", GetGdprDataController.php");

Maintenant, à l'intérieur de GetGdprDataController.php , nous aurons un accès direct au paramètre $userId .

 public function __invoke(int $userId) { // Use the userId that we received… }

Une route peut prendre n'importe quel nombre de paramètres. Ils sont injectés dans les rappels/contrôleurs de route en fonction de l'ordre dans lequel ils sont répertoriés :

 // api.php Route::post('/gdpr/{userId}/{userName}/{userAge}', GetGdprDataController.php); // GetGdprDataController.php public function __invoke(int $userId, string $userName, int $userAge) { // Use the parameters… }

Paramètres facultatifs

Dans une situation où nous voulons faire quelque chose sur une route alors qu'un seul paramètre est présent et rien d'autre, le tout sans affecter l'ensemble de l'application, nous pouvons ajouter un paramètre optionnel. Ces paramètres facultatifs sont désignés par le ? en annexe :

 Route::get('/user/{age?}', function (int $age = null) { if (!$age) Log::info("User doesn't have age set"); else Log::info("User's age is " . $age); } Route::get('/user/{name?}', function (int $name = "John Doe") { Log::info("User's name is " . $name); }

Caractère générique d'itinéraire

Laravel nous permet de filtrer à quoi devraient ressembler nos paramètres facultatifs ou obligatoires.

Disons que nous voulons une chaîne d'un ID utilisateur. Nous pouvons le valider ainsi au niveau de la route en utilisant la méthode where .

La méthode where accepte le nom du paramètre et la règle regex qui sera appliquée lors de la validation. Par défaut, il prend le premier paramètre, mais si nous en avons plusieurs, nous pouvons passer un tableau avec le nom du paramètre comme clé et la règle comme valeur, et Laravel les analysera tous pour nous :

 Route::get('/user/{age}', function (int $age) { // }->where('age', '[0-9]+'); Route::get('/user/{age}', function (int $age) { // }->where('[0-9]+'); Route::get('/user/{age}/{name}', function (int $age, string $name) { // }->where(['age' => '[0-9]+', 'name' => '[az][Az]+');

Nous pouvons aller plus loin et appliquer la validation sur toutes les routes de notre application en utilisant la méthode pattern sur la façade Route :

 Route::pattern('id', '[0-9]+');

Cela validera chaque paramètre id avec cette expression regex. Et une fois que nous l'avons défini, il sera automatiquement appliqué à toutes les routes utilisant ce nom de paramètre.

Comme nous pouvons le voir, Laravel utilise le caractère / comme séparateur dans le chemin. Si nous voulons l'utiliser dans le chemin, nous devons l'autoriser explicitement à faire partie de notre espace réservé en utilisant une regex where .

 Route::get('/find/{query}', function ($query) { // })->where('query', , '.*');

Le seul inconvénient est qu'il ne sera pris en charge que dans le dernier segment de route.

Itinéraires nommés

Comme son nom l'indique, nous pouvons nommer les routes, ce qui facilite la génération d'URL ou la redirection vers des routes spécifiques.

Aux prises avec des temps d'arrêt et des problèmes WordPress ? Kinsta est la solution d'hébergement conçue pour vous faire gagner du temps ! Découvrez nos fonctionnalités

Comment créer des routes nommées

Un moyen simple de créer une route nommée est fourni par la méthode name chaînée sur la façade Route . Le nom de chaque route doit être unique :

 Route::get('/', function () { })->name("homepage");

Groupes de routage

Les groupes de routage vous permettent de partager des attributs de routage tels que des middlewares sur un grand nombre de routages sans avoir à les redéfinir sur chaque routage.

Intergiciel

Attribuer un middleware à toutes les routes que nous avons nous permet de les combiner dans un groupe, d'abord en utilisant la méthode group . Une chose à considérer est que les middlewares sont exécutés dans l'ordre dans lequel ils sont appliqués au groupe :

 Route:middleware(['AuthMiddleware', 'SessionMiddleware'])->group(function () { Route::get('/', function() {} ); Route::post('/upload-picture', function () {} ); });

Contrôleurs

Lorsqu'un groupe utilise le même contrôleur, nous pouvons utiliser la méthode controller pour définir le contrôleur commun pour toutes les routes de ce groupe. Nous devons maintenant spécifier la méthode que la route appellera.

 Route::controller(UserController::class)->group(function () { Route::get('/orders/{userId}', 'getOrders'); Route::post('/order/{id}', 'postOrder'); });

Routage de sous-domaine

Un nom de sous-domaine est une information supplémentaire ajoutée au début du nom de domaine d'un site Web. Cela permet aux sites Web de séparer et d'organiser leur contenu pour des fonctions spécifiques, telles que les boutiques en ligne, les blogs, les présentations, etc., du reste du site Web.

Nos routes peuvent être utilisées pour gérer le routage des sous-domaines. Nous pouvons capturer le domaine et une partie du sous-domaine pour les utiliser dans notre contrôleur et notre route. A l'aide de la méthode domain sur la façade Route , nous pouvons regrouper nos routes sous un seul domaine :

 Route::domain('{store}.enterprise.com')->group(function() { Route::get('order/{id}', function (Account $account, string $id) { // Your Code } });

Préfixes et préfixes de nom

Chaque fois que nous avons un groupe de routes, au lieu de les modifier une par une, nous pouvons utiliser les utilitaires supplémentaires fournis par Laravel, tels que prefix et name sur la façade Route .

La méthode prefix peut être utilisée pour préfixer chaque route du groupe avec un URI donné, et la méthode name peut être utilisée pour préfixer chaque nom de route avec une chaîne donnée.

Cela nous permet de créer de nouvelles choses comme les routes d'administration sans avoir à modifier chaque nom ou préfixe pour les identifier :

 Route::name('admin.")->group(function() { Route::prefix("admin")->group(function() { Route::get('/get')->name('get'); Route::put('/put')->name(put'); Route::post('/post')->name('post'); }); });

Désormais, les URI de ces routes seront admin/get , admin/put , admin/post et les noms admin.get , admin.put et admin.post .

Mise en cache des itinéraires

Lors du déploiement de l'application sur des serveurs de production, un bon développeur Laravel tirera parti du cache de route de Laravel.

Qu'est-ce que la mise en cache de route ?

La mise en cache des routes réduit le temps nécessaire pour enregistrer toutes les routes d'application.

En exécutant php artisan route:cache une instance de Illuminate/Routing/RouteCollection est générée et, après avoir été encodée, la sortie sérialisée est écrite dans bootstrap/cache.routes.php .

Désormais, toute autre requête chargera ce fichier cache s'il existe. Par conséquent, notre application n'a plus besoin d'analyser et de convertir les entrées du fichier de routage en objets Illuminate/Routing/Route dans Illuminate/Routing/RouteCollection .

Pourquoi il est important d'utiliser la mise en cache de route

En n'utilisant pas la fonction de mise en cache des itinéraires fournie par Laravel, votre application risque de fonctionner plus lentement qu'elle ne le pourrait, ce qui pourrait à son tour réduire les ventes, la fidélisation des utilisateurs et la confiance en votre marque.

En fonction de l'échelle de votre projet et du nombre de routes, l'exécution d'une simple commande de mise en cache des routes peut accélérer votre application de 130 % à 500 %, un gain considérable pour presque aucun effort.

Sommaire

Le routage est l'épine dorsale du développement backend. Le framework Laravel excelle dans ce domaine en fournissant une manière détaillée de définir et de gérer les itinéraires. Familiarisez-vous avec le routage Laravel dans ce guide complet Cliquez pour tweeter

Le développement peut en effet être accessible à tous et aider à accélérer une application simplement parce qu'elle est construite dans Laravel.

Quels autres trucs et astuces avez-vous rencontrés concernant les itinéraires de Laravel ? Faites le nous savoir dans la section "Commentaires!