0 XP
?
API REST et Backend avec Laravel/Routes et contrôleurs
Débutant55 min35 XP

Objectifs de cette leçon

  • Définir des routes GET, POST, PUT, DELETE
  • Utiliser les route parameters et middleware
  • Organiser les routes avec des groupes

Routes et contrôleurs Laravel 🛣️

Le rôle des routes

Les routes sont le point d'entrée de toute requête HTTP dans Laravel. Elles définissent :

  • L'URL (/users, /posts/1)
  • La méthode HTTP (GET, POST, PUT, DELETE)
  • Le contrôleur et la méthode à appeler

💡 Les routes sont comme un standard téléphonique : elles reçoivent les appels (requêtes) et les dirigent vers le bon service (contrôleur).


Les fichiers de routes

Laravel organise les routes dans 4 fichiers sous routes/ :

FichierPréfixe URLMiddlewareUsage principal
api.php/apiapiAPI RESTful (JSON)
web.phpwebPages web (Blade, sessions)
console.phpCommandes Artisan
channels.phpBroadcasting (WebSockets)

⚠️ Pour une API, on utilise TOUJOURS routes/api.php. Les routes y sont automatiquement préfixées par /api et appliquent le middleware api.


Syntaxe des routes

Route simple avec closure

// routes/api.php
Route::get('/ping', function () {
    return response()->json(['message' => 'pong']);
});

Route avec contrôleur (recommandé ✅)

Route::get('/users', [UserController::class, 'index']);
Route::post('/users', [UserController::class, 'store']);
Route::get('/users/{id}', [UserController::class, 'show']);
Route::put('/users/{id}', [UserController::class, 'update']);
Route::delete('/users/{id}', [UserController::class, 'destroy']);

Paramètres dynamiques

Route::get('/users/{id}', [UserController::class, 'show']);
Route::get('/users/{id}/posts/{postId}', [UserController::class, 'showPost']);

Contraintes de validation

Route::get('/users/{id}', [UserController::class, 'show'])->where('id', '[0-9]+');

Les contrôleurs 🎯

Un contrôleur regroupe la logique métier liée à une ressource.

Création

php artisan make:controller UserController

Structure RESTful standard

Méthode HTTPURLMéthode du contrôleurAction
GET/usersindex()Lister toutes les ressources
POST/usersstore()Créer une nouvelle ressource
GET/users/{id}show()Afficher une ressource
PUT/PATCH/users/{id}update()Modifier une ressource
DELETE/users/{id}destroy()Supprimer une ressource
class UserController extends Controller
{
    public function index()
    {
        // 👇 Retourne tous les utilisateurs en JSON
        return response()->json(User::all());
    }

    public function show($id)
    {
        $user = User::findOrFail($id);
        return response()->json($user);
    }

    public function store(Request $request)
    {
        $user = User::create($request->validate([
            'name' => 'required|string',
            'email' => 'required|email|unique:users',
        ]));
        return response()->json($user, 201);
    }
}

Le cycle complet d'une requête API 🔄

  1. 🌐 Requête — Le client envoie GET /api/users
  2. 🛣️ Route — Laravel trouve Route::get('/users', [UserController::class, 'index'])
  3. 🎯 Contrôleur — Laravel appelle UserController::index()
  4. 🗄️ EloquentUser::all() génère SELECT * FROM users
  5. 📦 JSONresponse()->json($users) convertit en JSON
  6. 📨 Réponse — Laravel renvoie la réponse HTTP 200
  7. ✅ Client — Le frontend reçoit les données
Client                 Laravel                 BDD
  │                      │                      │
  │── GET /api/users ───→│                      │
  │                      │── SELECT * FROM ────→│
  │                      │←────── résultats ────│
  │←──── JSON 200 ──────│                      │
  │                      │                      │

Bonnes pratiques ✅

  1. Toujours utiliser des contrôleurs pour les routes qui font plus qu'un simple retour
  2. Nommer les routes pour faciliter les liens : Route::get(...)->name('users.index')
  3. Grouper les routes par préfixe : Route::prefix('admin')->group(...)
  4. Valider les données dans le contrôleur avec $request->validate()
  5. Retourner les bons codes HTTP : 200 (OK), 201 (créé), 404 (non trouvé), 422 (validation), 500 (erreur)
  6. Utiliser findOrFail() plutôt que find() pour éviter les erreurs silencieuses

Pièges fréquents 🚨

PiègeSolution
❌ Oublier le préfixe /api dans l'URLLes routes api.php sont automatiquement préfixées par /api
❌ Utiliser GET /api/users/delete/1Utilise DELETE /api/users/1 (REST)
❌ Mettre toute la logique dans la routeUtilise un contrôleur dédié
❌ Retourner du HTML depuis une APIToujours retourner response()->json()
❌ Ignorer les status codesLaravel définit 200 par défaut, mais 201 pour les créations

Exercices pour toi 🎯

  1. Pratique : Ajoute une route GET /api/posts qui pointe vers PostController@index. Crée le contrôleur avec Artisan.
  2. REST : Écris les 5 routes REST pour une ressource products.
  3. Validation : Ajoute une validation dans store() : name requis (string, max:255), price requis (numeric, min:0).
  4. Paramètre : Crée une route GET /api/users/{id}/posts qui retourne les posts d'un utilisateur.
  5. Défi : Ouvre le simulateur ci-dessous. Clique sur chaque étape du cycle requête → réponse pour visualiser le flux complet.

⚡ Simulateur — Routes et contrôleurs

Étape 1/7
📝 Pseudo-code
1# Routes et contrôleurs Laravel
2GET /api/users → routes/api.php # ⬅ requête entrante
3Route::get('/users', [UserController::class, 'index']) # ⬅ correspondance de route
4
5class UserController extends Controller {
6 public function index() { # ⬅ dispatch vers le contrôleur
7 $users = User::all(); # ⬅ Eloquent : tous les utilisateurs
8 return response()->json($users); # ⬅ réponse JSON
9 }
10}
11⬅ Réponse HTTP 200 + JSON envoyé au client # ⬅ réponse transmise
12Frontend: fetch('/api/users').then(data => ...) # ⬅ le client reçoit les données
🔄 Cycle route → contrôleur → JSON
⚡ Flux de la requête
🌐Requête
🛣️Route
🎯Contrôleur
🗄️Eloquent
📦JSON
📨HTTP
Client
🌐Requête entrante
Méthode : GET
URL : /api/users
Un client externe initie la communication.
Le fichier routes/api.php reçoit la requête grâce au préfixe /api défini dans RouteServiceProvider.
💡 Cycle complet d'une route API
📨 Requête HTTP🛣️ Route🎯 Contrôleur🗄️ Eloquent📦 JSON📨 Réponse✅ Client

Le fichier routes/api.php est le point d'entrée de toute requête préfixée par /api.