Tutoriel Laravel 13 #2 : Le routage
vérifié le 7 septembre 2026 · 5 min
Les routes se déclarent dans routes/web.php avec Route::get('/chemin', [MonController::class, 'methode']). Nommez-les avec ->name() pour construire vos liens par route('nom') plutôt qu’en dur. La syntaxe en chaîne 'Controller@methode' ne fonctionne plus depuis Laravel 8.
Une route associe une adresse à du code. C’est la porte d’entrée de toute requête : Laravel lit l’URL demandée, cherche la route qui correspond, et exécute ce qu’elle désigne. Ce chapitre montre les quatre formes que prend cette association.
La route la plus simple
Toutes les routes du site public se déclarent dans routes/web.php. Voici son contenu à l’installation :
<?php
use Illuminate\Support\Facades\Route;
Route::get('/', function () {
return view('welcome');
});Cette route dit : quand quelqu’un demande / en méthode GET, renvoie la vue welcome, c’est-à-dire le fichier resources/views/welcome.blade.php.
Route::get() prend deux arguments : l’adresse, et ce qu’il faut faire. Ce deuxième argument peut prendre plusieurs formes.
Renvoyer une chaîne
Route::get('/bonjour', function () {
return 'Bonjour !';
});Visitez http://127.0.0.1:8000/bonjour : le navigateur affiche le texte brut. C’est utile pour vérifier qu’une route est bien atteinte, rarement au-delà.
Renvoyer une vue
Pour vérifier que welcome est bien la vue affichée sur la page d’accueil, ouvrez resources/views/welcome.blade.php et ajoutez une ligne visible n’importe où dans le <body> :
<h1>Bonjour tout le monde !</h1>Rechargez la page d’accueil : le titre apparaît. Vous venez de modifier une vue, sans toucher à la route.
Renvoyer un contrôleur
Dans un vrai projet, la logique ne vit pas dans le fichier de routes mais dans un contrôleur. La route se contente alors de désigner une classe et une méthode :
use App\Http\Controllers\PostController;
Route::get('/article', [PostController::class, 'show']);Le tableau [PostController::class, 'show'] signifie « appelle la méthode show de la classe PostController ». Le contrôleur n’existe pas encore : le chapitre suivant le crée. Notez le use en haut du fichier, qui importe la classe. Sans lui, PHP cherchera PostController dans l’espace de noms global et ne le trouvera pas.
Beaucoup de tutoriels écrits pour Laravel 7 ou avant utilisent Route::get('/article', 'PostController@show'). Le préfixe d’espace de noms automatique qui rendait cette forme possible a été retiré dans Laravel 8. Sur Laravel 13, elle échoue avec ce message :
Illuminate\Contracts\Container\BindingResolutionException
Target class [PostController] does not exist.Laravel cherche la classe à la racine de l’espace de noms au lieu de App\Http\Controllers. Utilisez toujours la forme avec le tableau.
Les paramètres d’URL
Un blog a besoin d’adresses variables : /article/mon-premier-article, /article/un-autre. La partie qui change devient un paramètre, écrit entre accolades :
Route::get('/article/{slug}', function (string $slug) {
return "Vous avez demandé l'article : {$slug}";
});Laravel capture tout ce qui suit /article/ et le passe à la fonction sous le nom $slug. Le nom du paramètre dans l’URL et le nom de l’argument doivent correspondre.
Vous pouvez contraindre la forme attendue. Ici, la route ne répondra que si l’identifiant est numérique :
Route::get('/article/{id}', function (int $id) {
return "Article numéro {$id}";
})->whereNumber('id');Une URL comme /article/bonjour renverra alors une erreur 404, au lieu d’atteindre votre code avec une valeur inattendue.
Les routes nommées
Écrire les URL en dur dans les gabarits est fragile : le jour où vous renommez /article/ en /blog/, il faut retrouver chaque lien. Nommer la route règle le problème :
Route::get('/article/{slug}', [PostController::class, 'show'])->name('post');Le lien se construit alors depuis le nom, jamais depuis l’adresse :
route('post', ['slug' => 'mon-premier-article'])
// http://127.0.0.1:8000/article/mon-premier-articleDans une vue Blade, cela donne :
<a href="{{ route('post', $post) }}">{{ $post->title }}</a>Changez l’adresse dans web.php, tous les liens suivent. C’est la façon dont ce tutoriel construit tous ses liens à partir du chapitre 7.
La liaison de modèle
Laravel sait aller plus loin. Si le paramètre porte le nom d’un modèle, le framework va chercher l’enregistrement lui-même :
use App\Models\Post;
Route::get('/article/{post}', function (Post $post) {
return $post->title;
});Laravel lit le segment d’URL, interroge la table posts, et renvoie automatiquement une erreur 404 si rien ne correspond. Vous recevez directement l’objet, sans écrire la requête. Par défaut la recherche se fait sur la colonne id, le chapitre 6 montre comment lui demander d’utiliser le slug.
Cette liaison de modèle évite la moitié du code habituel d’un contrôleur. Elle est utilisée partout dans la suite du tutoriel.
Les autres verbes HTTP
Route::get() répond aux requêtes de lecture. Pour les formulaires et les API, Laravel expose les autres méthodes :
Route::post('/article', [PostController::class, 'store']);
Route::put('/article/{post}', [PostController::class, 'update']);
Route::delete('/article/{post}', [PostController::class, 'destroy']);Ce tutoriel n’utilise que get : les écritures passeront par le panneau d’administration installé au chapitre 4.
Voir toutes les routes
Cette commande liste ce que votre application sait servir :
php artisan route:list --except-vendorSur le projet terminé de ce tutoriel, une fois le panneau d’administration du chapitre 4 installé, elle affiche aussi les routes du back-office : elles sont déclarées par des classes de votre dossier app/Filament, pas par le paquet lui-même. Pour ne voir que les pages du site, ajoutez --except-path=admin :
php artisan route:list --except-vendor --except-path=admin GET|HEAD / .................................... home › IndexController
GET|HEAD article/{post} ................... post › PostController@show
GET|HEAD categorie/{category} .......... category › CategoryController
GET|HEAD etiquette/{tag} ......................... tag › TagController
GET|HEAD recherche .................... search › PostController@searchL’option --except-vendor masque les routes ajoutées par les paquets installés, --except-path=admin écarte celles du panneau d’administration, qui sont bien à vous. C’est la première commande à lancer quand une adresse renvoie une 404 alors que vous pensiez l’avoir déclarée.
Le chapitre suivant crée les contrôleurs et les vues que ces routes désignent.