API REST avec Laravel : Tutoriel approfondi
Pourquoi API REST avec Laravel ?
En tant que développeur senior sur 10 ans d'expérience, vous savez que les applications modernes sont souvent complexes et interconnectées. Les API REST jouent un rôle crucial dans ce processus en permettant aux différentes parties de votre application de communiquer entre elles. En particulier, si vous travaillez sur des projets basés sur le web ou qui impliquent des microservices, la création d'API REST est une compétence essentielle.
Un cas concret de cette nécessité peut être l'intégration avec un service tiers ou la création d'une application mobile qui doit communiquer avec votre backend. Par exemple, imaginez que vous développiez une application e-commerce et que vous souhaitez permettre aux utilisateurs d'interagir avec vos produits via une API RESTful pour récupérer des informations sur les produits, les catégories, les promotions, etc.
Prerequis
Pour suivre ce tutoriel, vous aurez besoin de :
- Un environnement PHP 7.4 ou plus récent
- Composer (généralement installé avec PHP)
- Node.js et npm pour les paquets JavaScript si nécessaire
- Une base de données MySQL ou PostgreSQL
- L'éditeur de code de votre choix (VSCode, Sublime Text, etc.)
Concepts fondamentaux
1. Ressources
Les ressources sont des entités qui ont une identité unique et peuvent être manipulées via les API REST. Par exemple, un utilisateur est une ressource.
## app/Models/User.php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class User extends Model {
protected $fillable = ['name', 'email', 'password'];
}
2. Points d'entrée (Endpoints)
Les points d'entrée sont les URLs qui permettent aux clients de demander des ressources.
## routes/api.php
use Illuminate\Http\Request;
use App\Models\User;
Route::middleware('auth:api')->get('/user', function (Request $request) {
return $request->user();
});
3. Méthodes HTTP
Les méthodes HTTP définissent l'action à effectuer sur les ressources.
## routes/api.php
use Illuminate\Http\Request;
use App\Models\User;
Route::post('/users', function (Request $request) {
return User::create($request->all());
});
Route::get('/users/{id}', function ($id) {
return User::findOrFail($id);
});
Route::put('/users/{id}', function (Request $request, $id) {
$user = User::findOrFail($id);
$user->update($request->all());
return $user;
});
Route::delete('/users/{id}', function ($id) {
User::destroy($id);
return response()->json(null, 204);
});
4. Middleware
Les middleware permettent de filtrer les requêtes HTTP avant qu'elles ne atteignent le contrôleur.
## app/Http/Middleware/Authenticate.php
namespace App\Http\Middleware;
use Closure;
use Illuminate\Support\Facades\Auth;
class Authenticate {
public function handle($request, Closure $next) {
if (!Auth::check()) {
return response()->json(['error' => 'Unauthorized'], 401);
}
return $next($request);
}
}
Mise en pratique : projet fil rouge
Étape 1 : Création du projet Laravel
composer create-project --prefer-dist laravel/laravel api-rest-tutorial
cd api-rest-tutorial
php artisan serve
Étape 2 : Configuration de la base de données
Modifiez le fichier .env pour configurer votre base de données MySQL.
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=api_rest_tutorial
DB_USERNAME=root
DB_PASSWORD=
Étape 3 : Création des modèles et migrations
php artisan make:model Task -m
php artisan migrate
Modifiez le fichier database/migrations/xxxx_xx_xx_xxxxxx_create_tasks_table.php :
## database/migrations/xxxx_xx_xx_xxxxxx_create_tasks_table.php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class CreateTasksTable extends Migration {
public function up() {
Schema::create('tasks', function (Blueprint $table) {
$table->id();
$table->string('title');
$table->text('description')->nullable();
$table->boolean('completed')->default(false);
$table->timestamps();
});
}
public function down() {
Schema::dropIfExists('tasks');
}
}
Étape 4 : Création du contrôleur
php artisan make:controller TaskController --api
Modifiez le fichier app/Http/Controllers/TaskController.php :
## app/Http/Controllers/TaskController.php
namespace App\Http\Controllers;
use App\Models\Task;
use Illuminate\Http\Request;
class TaskController extends Controller {
public function index() {
return response()->json(Task::all());
}
public function store(Request $request) {
$task = Task::create($request->all());
return response()->json($task, 201);
}
public function show($id) {
$task = Task::findOrFail($id);
return response()->json($task);
}
public function update(Request $request, $id) {
$task = Task::findOrFail($id);
$task->update($request->all());
return response()->json($task);
}
public function destroy($id) {
$task = Task::findOrFail($id);
$task->delete();
return response()->json(null, 204);
}
}
Étape 5 : Configuration des routes
Modifiez le fichier routes/api.php :
## routes/api.php
use App\Http\Controllers\TaskController;
Route::resource('tasks', TaskController::class);
Erreurs frequentes et debugging
1. Mauvaise configuration de la base de données
Code incorrect :
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=api_rest_tutorial
DB_USERNAME=root
DB_PASSWORD=
Code correct :
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=api_rest_tutorial
DB_USERNAME=root
DB_PASSWORD=password
2. Mauvaise route
Code incorrect :
Route::get('/tasks', function () {
return Task::all();
});
Code correct :
Route::resource('tasks', TaskController::class);
Pour aller plus loin
- Authentification JWT avec Laravel Passport : Découvrez comment sécuriser votre API en utilisant des tokens JWT.
- Documentation Swagger avec L5-Swagger : Créez une documentation interactive pour votre API.
- Tests d'API avec Postman ou Insomnia : Automatisez les tests de vos endpoints.
Défi pratique : Ajoutez une fonctionnalité pour marquer une tâche comme terminée.