Chapitre 2 sur 9

Tutoriel Laravel 13 #2 : Le routage

vérifié le 7 septembre 2026 · 5 min

Réponse rapide

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.

À la fin de ce chapitre, vous saurez associer une adresse à un contrôleur, lire un paramètre d’URL, nommer une route et laisser Laravel charger un modèle à votre place.

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 :

routes/web.php
<?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

routes/web.php
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> :

resources/views/welcome.blade.php
<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 :

routes/web.php
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.

La syntaxe en chaîne n’existe plus

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 :

code
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 :

routes/web.php
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 :

routes/web.php
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 :

routes/web.php
Route::get('/article/{slug}', [PostController::class, 'show'])->name('post');

Le lien se construit alors depuis le nom, jamais depuis l’adresse :

php
route('post', ['slug' => 'mon-premier-article'])
// http://127.0.0.1:8000/article/mon-premier-article

Dans une vue Blade, cela donne :

markup
<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 :

routes/web.php
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 :

php
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 :

bash
php artisan route:list --except-vendor

Sur 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 :

bash
php artisan route:list --except-vendor --except-path=admin
code
  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@search

L’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.

Erreurs fréquentes

Target class [MonController] does not exist La syntaxe 'MonController@methode' n’est plus supportée depuis Laravel 8 : Laravel cherche la classe à la racine de l’espace de noms. Utilisez la forme [MonController::class, 'methode'] avec le use correspondant.
Une route fixe capturée par une route à paramètre Laravel s’arrête à la première route qui correspond. Déclarez /recherche avant /{slug}, sinon la seconde intercepte la première.
Une route déclarée renvoie quand même 404 Lancez php artisan route:list --except-vendor pour voir ce que l’application sait réellement servir.
Newsletter

Les nouveaux tests, tutoriels et projets, par e-mail.

Tests reproductibles, code versionné, résultats datés. Jamais de spam.