Aller au contenu principal

Module 16 – API REST avec Laravel

Niveau 4 – Laravel avancé (PRO)


Objectifs

Au programme :

  • Concevoir une API REST avec Laravel (routes api.php, contrôleurs dédiés)
  • Utiliser les API Resources pour formater les réponses JSON de façon cohérente
  • Sécuriser l’API avec Laravel Sanctum (tokens pour SPA ou mobile)
  • Mettre en place versioning et pagination pour une API professionnelle
  • Réaliser un projet API complète (CRUD, auth, resources, tests)

Théorie

Routes API (routes/api.php)

Les routes dans routes/api.php sont préfixées par /api et ont le middleware api (pas de session, pas de CSRF ; attente de JSON). Idéal pour une API consommée par un front (Vue, React, mobile).

use App\Http\Controllers\Api\ArticleController;

Route::apiResource('articles', ArticleController::class);
// GET /api/articles -> index
// GET /api/articles/{id} -> show
// POST /api/articles -> store
// PUT /api/articles/{id} -> update
// DELETE /api/articles/{id} -> destroy

Versioning : préfixer par un numéro de version pour ne pas casser les clients existants.

Route::prefix('v1')->group(function () {
Route::apiResource('articles', ArticleController::class);
});
// /api/v1/articles

Réponses JSON cohérentes

Réponse simple :

return response()->json(['data' => $articles]);

Code HTTP :

return response()->json(['message' => 'Created'], 201);
return response()->json(['error' => 'Not found'], 404);

API Resources : classes qui transforment un modèle (ou une collection) en tableau JSON structuré. On contrôle les champs exposés, les relations, les métadonnées.

Créer une resource :

php artisan make:resource ArticleResource
php artisan make:resource ArticleCollection # pour les listes

ArticleResource.php :

namespace App\Http\Resources;

use Illuminate\Http\Request;
use Illuminate\Http\Resources\Json\JsonResource;

class ArticleResource extends JsonResource
{
public function toArray(Request $request): array
{
return [
'id' => $this->id,
'title' => $this->title,
'body' => $this->body,
'user' => new UserResource($this->whenLoaded('user')),
'created_at' => $this->created_at->toIso8601String(),
];
}
}

Dans le contrôleur :

return new ArticleResource($article);
return ArticleResource::collection($articles); // liste

Pagination : Laravel pagine et ajoute meta et links automatiquement.

return ArticleResource::collection(Article::paginate(15));

Authentification API : Laravel Sanctum

Sanctum permet :

  • Tokens pour des clients sans navigateur (mobile, autre service) : l’utilisateur se connecte une fois, reçoit un token à envoyer dans Authorization: Bearer <token>.
  • Authentification SPA : si l’API est consommée par une SPA sur le même domaine, on peut utiliser les cookies de session (sanctum comme garde).

Installation : fourni avec Laravel ; config dans config/sanctum.php.

Créer un token (ex. après login) :

$user = User::where('email', $request->email)->first();
if (!$user || !Hash::check($request->password, $user->password)) {
return response()->json(['message' => 'Invalid credentials'], 401);
}
$token = $user->createToken('app-name')->plainTextToken;
return response()->json(['token' => $token, 'user' => new UserResource($user)]);

Protéger les routes API : middleware auth:sanctum.

Route::middleware('auth:sanctum')->group(function () {
Route::apiResource('articles', ArticleController::class);
});

Le client envoie ensuite : Authorization: Bearer <token>.

Révoquer un token : $request->user()->currentAccessToken()->delete(); (logout).


Pagination

Pour les listes, toujours paginer pour éviter de renvoyer des milliers de lignes.

$articles = Article::with('user')->paginate(15);
return ArticleResource::collection($articles);

Réponse typique : data (page courante), meta (current_page, total, per_page), links (prev, next, etc.).


Gestion des erreurs et validation

  • Validation : en API, $request->validate() renvoie automatiquement du JSON (422) avec les erreurs par champ.
  • 404 : abort(404) ou response()->json([], 404).
  • Exception handler : personnaliser app/Exceptions/Handler.php pour renvoyer un format JSON cohérent en cas d’exception (message, code).

Exemple de contrôleur API

namespace App\Http\Controllers\Api;

use App\Http\Controllers\Controller;
use App\Http\Resources\ArticleResource;
use App\Models\Article;
use Illuminate\Http\Request;

class ArticleController extends Controller
{
public function index()
{
return ArticleResource::collection(Article::with('user')->paginate(15));
}

public function show(Article $article)
{
return new ArticleResource($article->load('user'));
}

public function store(Request $request)
{
$validated = $request->validate([...]);
$article = Article::create($validated);
return (new ArticleResource($article))->response()->setStatusCode(201);
}

public function update(Request $request, Article $article)
{
$article->update($request->validate([...]));
return new ArticleResource($article);
}

public function destroy(Article $article)
{
$article->delete();
return response()->json(null, 204);
}
}

En pratique

  1. Toujours utiliser des API Resources pour un format de réponse stable et documentable.
  2. Pagination sur les listes (index).
  3. Sanctum pour l’auth API (tokens ou session SPA selon le cas).
  4. Versioning (ex. /api/v1/) pour faire évoluer l’API sans casser les clients.
  5. Codes HTTP cohérents : 200, 201, 204, 400, 401, 403, 404, 422.

Quiz – Module 16

Q1. Quelle est la différence entre les routes web et api dans Laravel ?
Q2. À quoi servent les API Resources ?
Q3. Comment protéger une route API pour qu’elle ne soit accessible qu’avec un token ?
Q4. Comment paginer une liste dans une réponse API ?
Q5. Quel package Laravel utilise-t-on pour l’authentification par token API ?

Réponses

R1. Les routes web ont session, CSRF, cookies ; les routes api sont préfixées par /api, sans session, et renvoient du JSON (middleware api).

R2. À formater les modèles (ou collections) en structure JSON cohérente (champs choisis, relations conditionnelles, métadonnées) pour les réponses API.

R3. Avec le middleware auth:sanctum ; le client envoie le token dans l’en-tête Authorization: Bearer <token>.

R4. En utilisant paginate() sur le query builder puis en renvoyant une Resource::collection() sur le résultat ; Laravel ajoute meta et links.

R5. Laravel Sanctum (tokens pour API ; peut aussi gérer l’auth SPA sur le même domaine).


Projet : API complète

Cahier des charges :

  • Une ressource (ex. articles ou produits) en CRUD complet via API (index, show, store, update, destroy).
  • Sanctum : login (email/password) renvoie un token ; les routes de modification (store, update, destroy) protégées par auth:sanctum.
  • API Resources pour toutes les réponses concernant la ressource.
  • Pagination sur l’index.
  • Validation via Form Request ou $request->validate().
  • Versioning : préfixe /api/v1/.
  • (Bonus) Tests feature pour au moins 2 routes (ex. index et store).

Critères de réussite : Réponses JSON cohérentes, codes HTTP corrects, documentation ou collection Postman/Insomnia pour tester.


Suite

Module 17 – Tests (tests unitaires, feature, PHPUnit/Pest, mocking, examen écriture de tests).