Hasina Razafintsalama

Hasina RAZAFINTSALAMA

← Retour au Blog
Backend

Concevoir une API REST robuste et scalable avec Laravel

Resource controllers, API resources, authentification, versioning, rate limiting,les briques d'une API Laravel prête pour la production.

2026-05-28·7 min

Laravel est l'un des meilleurs frameworks pour construire des API REST rapidement. Mais "rapide" ne signifie pas "production-ready" par défaut. Quelques décisions structurelles prises tôt détermineront si votre API scale gracieusement ou devient un fardeau de maintenance.

Structure : API Resources plutôt que tableaux bruts

Ne jamais retourner les modèles Eloquent directement depuis les contrôleurs. Utiliser les API Resources pour contrôler exactement ce que l'API expose,et découpler le schéma de base de données du contrat API.

php
// Mauvais : expose tout, y compris les champs internes
return response()->json($user);

// Bien : contrat API contrôlé et versionné
class UserResource extends JsonResource {
    public function toArray(Request $request): array {
        return [
            'id'         => $this->id,
            'name'       => $this->name,
            'email'      => $this->email,
            'created_at' => $this->created_at->toISOString(),
        ];
    }
}

return new UserResource($user);

Versioning dès le premier jour

Versionner l'API dès le départ, même si on n'a que v1. Ça ne coûte rien au départ et évite de casser les clients plus tard. Utiliser le versioning URI : `/api/v1/users`, `/api/v2/users`.

Authentification avec Sanctum ou Passport

Utiliser Laravel Sanctum pour l'auth token SPA/mobile. Utiliser Laravel Passport uniquement pour un serveur OAuth2 complet (clients tiers). Sanctum couvre 90% des cas avec bien moins de complexité.

Rate limiting et throttling

php
// routes/api.php
Route::middleware(['auth:sanctum', 'throttle:60,1'])->group(function () {
    Route::apiResource('users', UserController::class);
});

// Throttle custom : 10 requêtes/minute pour les endpoints coûteux
Route::middleware('throttle:10,1')->post('/reports/generate', [ReportController::class, 'generate']);
  • Toujours valider les entrées au niveau du Form Request,jamais dans le contrôleur
  • Retourner des erreurs cohérentes au format RFC 7807 Problem Details
  • Logger toutes les réponses 4xx/5xx pour le monitoring
  • Utiliser les headers ETag pour les endpoints GET cache-friendly

Besoin d'aide sur ce sujet ? Conception d'API REST

Découvrir ce service