Laravel est le framework PHP le plus utilisé pour construire des applications web : il fournit routage, contrôleurs, moteur de templates (Blade), ORM (Eloquent), validation, files d’attente, tests… Ce cours suit Laravel 13, qui demande PHP 8.3 ou plus (nous utilisons PHP 8.5) et Composer 2.
Créer un projet
# Avec l'installateur officiel
composer global require laravel/installer
laravel new boutique # pose quelques questions (starter kit, base, Pest ou PHPUnit...)
# Ou directement avec Composer
composer create-project laravel/laravel boutique
cd boutique
php artisan serve # http://127.0.0.1:8000
# ou : php artisan dev # serveur + file d'attente + logs + Vite (aussi : composer run dev)
Par défaut, un nouveau projet utilise SQLite (database/database.sqlite, créé et migré dès l’installation) : aucun serveur de base n’est nécessaire pour débuter. composer create-project installe PHPUnit pour les tests ; l’installateur vous laisse choisir entre Pest et PHPUnit.
L’arborescence essentielle
| Dossier / fichier | Rôle |
|---|---|
routes/web.php |
routes des pages web |
app/Http/Controllers |
contrôleurs |
app/Models |
modèles Eloquent |
resources/views |
vues Blade |
database/migrations |
évolution du schéma |
bootstrap/app.php |
configuration de l’application (middleware, routes, exceptions) |
.env |
configuration locale : base, APP_KEY, mode debug |
Le fichier .env contient des secrets : il est listé dans .gitignore, et c’est .env.example qui est versionné.
Première route
// routes/web.php
use Illuminate\Support\Facades\Route;
Route::get('/', function () {
return view('welcome'); // affiche resources/views/welcome.blade.php
});
Route::get('/bonjour', fn () => 'Bonjour Laravel !'); // une chaîne devient une réponse HTML
Une route associe un verbe HTTP (get, post, put, patch, delete) et une URI à une action.
Paramètres et contraintes
Route::get('/articles/{id}', function (string $id) {
return "Article n° $id";
})->whereNumber('id'); // /articles/abc renverra 404
Route::get('/auteurs/{nom?}', fn (?string $nom = null) => $nom ?? 'Tous les auteurs'); // paramètre optionnel
Les paramètres sont injectés dans la fonction dans l’ordre où ils apparaissent dans l’URI.
Routes nommées
Route::get('/articles/{id}', [ArticleController::class, 'show'])->name('articles.show');
// Ailleurs (contrôleur, vue) :
$url = route('articles.show', ['id' => 42]); // http://127.0.0.1:8000/articles/42
return redirect()->route('articles.show', ['id' => 42]);
Nommer les routes permet de changer une URI sans casser tous les liens de l’application.
Artisan, votre assistant en ligne de commande
php artisan route:list # toutes les routes, leurs noms et actions
php artisan make:controller ArticleController
php artisan tinker # console interactive
Les routes d’API (routes/api.php) ne sont plus présentes par défaut depuis Laravel 11 : on les ajoute avec php artisan install:api, que nous verrons dans le cours avancé.
Dans les exercices exécutables, vous allez recoder en PHP pur le cœur d’un routeur, pour comprendre ce que Laravel fait pour vous ; les tâches vous feront ensuite pratiquer dans un vrai projet.
Exercices
Les solutions et les tests restent sur le serveur. Dans l'espace étudiant, ton code est exécuté et corrigé, et le tuteur donne des indices avant la solution.
Faire correspondre une route
Recodez le cœur d’un routeur. Écrivez
matchRoute(string $pattern, string $uri): ?array:$patterncontient des paramètres entre accolades, ex./articles/{id};- si l’URI correspond, renvoyez un tableau
nom => valeurdes paramètres (tableau vide s’il n’y en a pas) ; - sinon renvoyez
null.
Un paramètre correspond à un segment non vide sans
/. Ignorez les/de début et de fin.function matchRoute(string $pattern, string $uri): ?array { }Générer une URL depuis un nom de route
Écrivez
urlPour(array $routes, string $nom, array $params = []): stringqui reproduit la fonctionroute():$routesassocie un nom à une URI, ex.['articles.show' => '/articles/{article}'];- remplacez chaque
{param}par la valeur fournie (encodée avecrawurlencode) ; - lancez une
InvalidArgumentExceptionsi le nom est inconnu ou si un paramètre manque.
function urlPour(array $routes, string $nom, array $params = []): string { }Créer un projet Laravel et ses premières routes
Dans votre environnement, créez un projet Laravel 13 nommé
boutique, puis ajoutez dansroutes/web.php:- une route
GET /bonjourqui renvoie le texteBonjour Laravel !; - une route nommée
articles.showsur/articles/{id}contrainte aux nombres, qui renvoieArticle n° {id}.
Lancez le serveur et testez les URL dans le navigateur ou avec
curl.- `composer create-project laravel/laravel boutique` (ou `laravel new boutique`) s'est terminé sans erreur
- `curl http://127.0.0.1:8000/bonjour` affiche Bonjour Laravel !
- `/articles/7` affiche Article n° 7 et `/articles/abc` renvoie une 404
- `php artisan route:list` affiche la route nommée articles.show
- une route
Ordre des routes
Les routes
GET /articles/{id}puisGET /articles/createsont déclarées dans cet ordre, sans contrainte. Que se passe-t-il pour/articles/create?- La route /articles/{id} est utilisée avec id = 'create'
- Laravel choisit toujours la route la plus spécifique
- Une erreur 500 est levée
Quiz de fin de leçon
Quelle version minimale de PHP Laravel 13 exige-t-il ?
- PHP 8.1
- PHP 8.3
- PHP 8.5
Quel est l’intérêt de ->name(‘articles.show’) ?
- Accélérer la route
- Générer les URL avec route('articles.show', ...) sans les écrire en dur
- Rendre la route privée
Quelle commande affiche toutes les routes de l’application ?
- php artisan route:list
- php artisan routes
- composer routes
La suite du cours
- Contrôleurs, requêtes et réponses20 min
- Vues Blade : templates, layouts et composants20 min
- Migrations et modèles Eloquent20 min
- Validation et formulaires20 min