Installer Laravel et définir ses routes

Première leçon du cours Laravel fondamentaux, en accès libre : environ 20 minutes, 4 exercices et 3 questions de quiz. C'est la leçon de base du catalogue ; dans l'espace étudiant, elle est réécrite pour ton profil.

Objectifs

  • Créer un projet Laravel 13 et en comprendre l'arborescence
  • Déclarer des routes avec paramètres, contraintes et noms
  • Générer des URL à partir du nom d'une route

Installation et structureRoutageArtisan

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.

  1. CodeDifficulté 2Sandbox serveur2 indices

    Faire correspondre une route

    Recodez le cœur d’un routeur. Écrivez matchRoute(string $pattern, string $uri): ?array :

    • $pattern contient des paramètres entre accolades, ex. /articles/{id} ;
    • si l’URI correspond, renvoyez un tableau nom => valeur des 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
    {
    }
  2. CodeDifficulté 2Sandbox serveur2 indices

    Générer une URL depuis un nom de route

    Écrivez urlPour(array $routes, string $nom, array $params = []): string qui reproduit la fonction route() :

    • $routes associe un nom à une URI, ex. ['articles.show' => '/articles/{article}'] ;
    • remplacez chaque {param} par la valeur fournie (encodée avec rawurlencode) ;
    • lancez une InvalidArgumentException si le nom est inconnu ou si un paramètre manque.
    function urlPour(array $routes, string $nom, array $params = []): string
    {
    }
  3. TâcheDifficulté 12 indices

    Créer un projet Laravel et ses premières routes

    Dans votre environnement, créez un projet Laravel 13 nommé boutique, puis ajoutez dans routes/web.php :

    1. une route GET /bonjour qui renvoie le texte Bonjour Laravel ! ;
    2. une route nommée articles.show sur /articles/{id} contrainte aux nombres, qui renvoie Article 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
  4. QCMDifficulté 21 indice

    Ordre des routes

    Les routes GET /articles/{id} puis GET /articles/create sont 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

  1. Quelle version minimale de PHP Laravel 13 exige-t-il ?

    • PHP 8.1
    • PHP 8.3
    • PHP 8.5
  2. 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
  3. Quelle commande affiche toutes les routes de l’application ?

    • php artisan route:list
    • php artisan routes
    • composer routes

La suite du cours

  1. Contrôleurs, requêtes et réponses20 min
  2. Vues Blade : templates, layouts et composants20 min
  3. Migrations et modèles Eloquent20 min
  4. Validation et formulaires20 min

Laravel fondamentaux · Intermédiaire · 3 h 40