Apprendre à créer de routes en Laravel - Letecode

Le Routage

Dernière mise à jour : 17/06/2022

Dans ce chapitre, vous allez apprendre à définir les routes (les différents URL) de votre application web en Laravel

Routage de base

Les routes Laravel les plus basiques acceptent un URI et une fermeture, fournissant une méthode très simple et expressive pour définir les routes et le comportement sans fichiers de configuration de routage compliqués :

use Illuminate\Support\Facades\Route;
Route::get('/greeting', function () {
    return 'Hello World';
});

Les fichiers de routage par défaut

Toutes les routes Laravel sont définies dans vos fichiers de route, qui se trouvent dans le répertoire routes. Ces fichiers sont automatiquement chargés par le fichier App\Providers\RouteServiceProvider. Le fichier routes/web.php définit les itinéraires qui sont destinés à votre interface Web. Ces routes sont affectées au groupe web middleware, qui fournit des fonctionnalités telles que l'état de session et la protection CSRF. Les routes dans routes/api.php sont sans état et sont affectées au groupe api middleware.

Pour la plupart des applications, vous commencerez par définir des routes dans votre fichier routes/web.php. Les routes définis dans routes/web.php sont accessibles en saisissant l'URL de la route défini dans votre navigateur. Par exemple, vous pouvez accéder à la route suivante en naviguant vers http://example.com/user dans votre navigateur :

use App\Http\Controllers\UserController;



Route::get('/user', [UserController::class, 'index']);

 

Méthodes de routeur disponibles

Le routeur vous permet d'enregistrer des routes qui répondent à n'importe quel verbe HTTP :

Route::get($uri, $callback);
Route::post($uri, $callback);
Route::put($uri, $callback);
Route::patch($uri, $callback);
Route::delete($uri, $callback);
Route::options($uri, $callback);

Parfois, vous devrez peut-être enregistrer une route qui répond à plusieurs verbes HTTP. Vous pouvez le faire en utilisant la méthode match. Ou, vous pouvez même enregistrer une route qui répond à tous les verbes HTTP en utilisant la méthode any:

 

Route::match(['get', 'post'], '/', function () {
    //
});
 
Route::any('/', function () {
    //
});

 

Protection CSRF

N'oubliez pas que tous les formulaires HTML pointant vers des routes POST, PUT, PATCH ou DELETE  définis dans le fichier web des routes, doivent inclure un champ de jeton CSRF. A défaut, la demande sera rejetée. Vous pouvez en savoir plus sur la protection CSRF dans le chapitre sur CSRF :

 

<form method="POST" action="/profile">
    @csrf
    ...
</form>

Paramètres des routes

Paramètres requis

Parfois, vous devrez capturer des segments de l'URL dans votre route. Par exemple, vous devrez peut-être capturer l'ID d'un utilisateur à partir de l'URL. Vous pouvez le faire en définissant les paramètres de route :

 

Route::get('/user/{id}', function ($id) {
    return 'User '.$id;
});

Vous pouvez définir autant de paramètres de route que requis par votre route :

Route::get('/posts/{post}/comments/{comment}', function ($postId, $commentId) {
  //
});

Les paramètres de route sont toujours entourés d'accolades {} et doivent être composés de caractères alphabétiques. Les traits de soulignement ( _) sont également acceptables dans les noms de paramètre de route. Les paramètres de route sont injectés dans les rappels(callbacks)/contrôleurs de route en fonction de leur ordre - les noms des arguments de rappel(callbacks)/contrôleur de route n'ont pas d'importance.

Paramètres et injection de dépendance

Si votre route a des dépendances que vous aimeriez que le conteneur de service Laravel injecte automatiquement dans le rappel de votre route, vous devez lister vos paramètres de route après vos dépendances :

use Illuminate\Http\Request;

Route::get('/user/{id}', function (Request $request, $id) {
    return 'User '.$id;
});

 

Paramètres facultatifs

Parfois, vous devrez peut-être spécifier un paramètre de route qui n'est pas toujours présent dans l'URI. Vous pouvez le faire en plaçant une marque ? après le nom du paramètre. Assurez-vous de donner une valeur par défaut à la variable correspondante de la route :

 

Route::get('/user/{name?}', function ($name = null) {
    return $name;
});
 
Route::get('/user/{name?}', function ($name = 'John') {
    return $name;
});

Routes nommés

Les routes nommées permettent la génération pratique d'URL ou de redirections pour des routes spécifiques. Vous pouvez spécifier un nom pour une route en enchaînant la méthode name sur la définition de route :

 

Route::get('/user/profile', function () {
    //
})->name('profile');



Vous pouvez également spécifier des noms de route pour les actions du contrôleur :

 

Route::get(
    '/user/profile',
    [UserProfileController::class, 'show']
)->name('profile');

 

Attention : Les noms de route doivent toujours être uniques.

 

Génération d'URL vers des routes nommées

Une fois que vous avez attribué un nom à une route donnée, vous pouvez utiliser le nom de la route lors de la génération d'URL ou de redirections via les fonctions de Laravel route et d' redirectassistance :

// Géneration d'URLs...

$url = route('profile');

 

// Géneration de redirection...

return redirect()->route('profile');

 

Si la route nommée définit des paramètres, vous pouvez passer les paramètres comme deuxième argument à la route fonction. Les paramètres donnés seront automatiquement insérés dans l'URL générée dans leurs positions correctes :

 

Route::get('/user/{id}/profile', function ($id) {
//
})->name('profile');



$url = route('profile', ['id' => 1]);


Si vous transmettez des paramètres supplémentaires dans le tableau, ces paires clé/valeur seront automatiquement ajoutées à la chaîne de requête de l'URL générée :

 

Route::get('/user/{id}/profile', function ($id) {
//
})->name('profile');
 
$url = route('profile', ['id' => 1, 'photos' => 'yes']);
 
// /user/1/profile?photos=yes

 

Groupes de routes

Les groupes de routage vous permettent de partager des attributs de routage, tels que le middleware, sur un grand nombre de routes sans avoir à définir ces attributs sur chaque routage individuel.

Les groupes imbriqués tentent de "fusionner" intelligemment les attributs avec leur groupe parent. Le middleware et les conditions sont fusionnés tandis que les noms et les préfixes sont ajoutés. Les délimiteurs d'espace de noms et les barres obliques dans les préfixes d'URI sont automatiquement ajoutés, le cas échéant.

Middleware

Pour affecter un middleware à toutes les routes d'un groupe, vous pouvez utiliser la méthode middleware avant de définir le groupe. Les middleware (intergiciels) sont exécutés dans l'ordre dans lequel ils sont répertoriés dans le tableau :

 

Route::middleware(['first', 'second'])->group(function () {
    Route::get('/', function () {
        // utilise first & second middleware...
    });
 
    Route::get('/user/profile', function () {
        // utilise first & second middleware...
    });
});

 

Contrôleurs

Si un groupe de routes utilise toutes le même contrôleur , vous pouvez utiliser la méthode controller pour définir le contrôleur commun pour toutes les routes du groupe. Ensuite, lors de la définition des routes, il vous suffit de fournir la méthode de contrôleur qu'ils invoquent :

 

use App\Http\Controllers\PostController;
 
Route::controller(PostController::class)->group(function () {
    Route::get('/posts/{id}', 'show');
    Route::post('/posts', 'store');
});

 

Routes de sous-domaine

Les groupes de routage peuvent également être utilisés pour gérer le routage de sous-domaine. Les sous-domaines peuvent se voir attribuer des paramètres de route, tout comme les URI de route, ce qui vous permet de capturer une partie du sous-domaine pour l'utiliser dans votre route ou votre contrôleur. Le sous-domaine peut être spécifié en appelant la méthode domain avant de définir le groupe :

 

Route::domain('{account}.example.com')->group(function () {
    Route::get('user/{id}', function ($account, $id) {
        //
    });
});

 

Afin de vous assurer que vos routes de sous-domaine sont accessibles, vous devez enregistrer les routes de sous-domaine avant d'enregistrer les routes de domaine racine. Cela empêchera les routes de domaine racine d'écraser les routes de sous-domaine qui ont le même chemin d'URI.

Préfixes de routes

La méthode prefix peut être utilisée pour préfixer chaque route du groupe avec un URI donné. Par exemple, vous pouvez préfixer tous les URI de route au sein du groupe avec admin :

 

Route::prefix('admin')->group(function () {
    Route::get('/users', function () {
        // Matches "/admin/users" URL
    });
});

 

il y a bien des multiples options sur la façon dont vous pourez gérer les routes dans votre application en allant dans la documentation officielle de Laravel.

Dans le chapitre suivant nous allons voir une brève explication sur l'architecture MVC qui est utilisée par la plupart des frameworks avant de se lancer en profondeur.