Maison >développement back-end >tutoriel php >Comment créer une API REST à l'aide de Laravel
Bonjour ! Dans ce didacticiel, nous allons créer une API REST complète dans Laravel pour gérer les tâches. Je vous guiderai à travers les étapes de base, de la configuration du projet à la création de tests automatisés.
Créez un nouveau projet Laravel :
composer create-project laravel/laravel task-api cd task-api code .
Configurer la base de données :
Dans le fichier .env, définissez les configurations de votre base de données :
DB_DATABASE=task_api DB_USERNAME=your_username DB_PASSWORD=your_password
Générer le tableau des tâches :
Exécutez la commande pour créer une nouvelle migration pour la table des tâches :
php artisan make:migration create_tasks_table --create=tasks
Dans le fichier de migration (database/migrations/xxxx_xx_xx_create_tasks_table.php), définissez la structure de la table :
<?php use Illuminate\Database\Migrations\Migration; use Illuminate\Database\Schema\Blueprint; use Illuminate\Support\Facades\Schema; return new class extends Migration { public function up(): void { 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(): void { Schema::dropIfExists('tasks'); } };
Exécutez la migration pour créer la table :
php artisan migrate
Créez le modèle et le contrôleur pour la tâche :
php artisan make:model Task php artisan make:controller TaskController --api
Définir le modèle de tâche (app/Models/Task.php) :
<?php namespace App\Models; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; class Task extends Model { use HasFactory; protected $fillable = ['title', 'description', 'completed']; }
Dans le fichier routes/api.php, ajoutez les routes pour le TaskController :
<?php use App\Http\Controllers\TaskController; use Illuminate\Support\Facades\Route; Route::apiResource('tasks', TaskController::class);
Dans TaskController, nous implémenterons les méthodes CRUD de base.
<?php namespace App\Http\Controllers; use App\Models\Task; use Illuminate\Http\Request; class TaskController extends Controller { public function index() { $tasks = Task::all(); return response()->json($tasks, 200); } public function store(Request $request) { $request->validate([ 'title' => 'required|string|max:255', 'description' => 'nullable|string' ]); $task = Task::create($request->all()); return response()->json($task, 201); } public function show(Task $task) { return response()->json($task, 200); } public function update(Request $request, Task $task) { $request->validate([ 'title' => 'required|string|max:255', 'description' => 'nullable|string', 'completed' => 'boolean' ]); $task->update($request->all()); return response()->json($task, 201); } public function destroy(Task $task) { $task->delete(); return response()->json(null, 204); } }
Nous allons maintenant tester chaque point de terminaison manuellement, à l'aide d'une extension VS Code appelée REST Client (https://marketplace.visualstudio.com/items?itemName=humao.rest-client). Si vous préférez, vous pouvez également utiliser Insomnia ou Facteur !
Après avoir installé l'extension, créez un fichier .http dans votre dossier de projet avec le contenu suivant :
### Create New Task POST http://127.0.0.1:8000/api/tasks HTTP/1.1 content-type: application/json Accept: application/json { "title": "Study Laravel" } ### Show Tasks GET http://127.0.0.1:8000/api/tasks HTTP/1.1 content-type: application/json Accept: application/json ### Show Task GET http://127.0.0.1:8000/api/tasks/1 HTTP/1.1 content-type: application/json Accept: application/json ### Update Task PUT http://127.0.0.1:8000/api/tasks/1 HTTP/1.1 content-type: application/json Accept: application/json { "title": "Study Laravel and Docker", "description": "We are studying!", "completed": false } ### Delete Task DELETE http://127.0.0.1:8000/api/tasks/1 HTTP/1.1 content-type: application/json Accept: application/json
Ce fichier vous permet d'envoyer des requêtes directement depuis VS Code à l'aide de l'extension REST Client, ce qui facilite le test de chaque route dans votre API.
Ensuite, créons des tests pour nous assurer que chaque itinéraire fonctionne comme prévu.
Tout d'abord, créez une usine pour le modèle de tâches :
php artisan make:factory TaskFactory
<?php namespace Database\Factories; use Illuminate\Database\Eloquent\Factories\Factory; class TaskFactory extends Factory { public function definition(): array { return [ 'title' => fake()->sentence(), 'description' => fake()->paragraph(), 'completed' => false, ]; } }
Configuration PHPUnit :
<?xml version="1.0" encoding="UTF-8"?> <phpunit xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="vendor/phpunit/phpunit/phpunit.xsd" bootstrap="vendor/autoload.php" colors="true" > <testsuites> <testsuite name="Unit"> <directory>tests/Unit</directory> </testsuite> <testsuite name="Feature"> <directory>tests/Feature</directory> </testsuite> </testsuites> <source> <include> <directory>app</directory> </include> </source> <php> <env name="APP_ENV" value="testing" /> <env name="BCRYPT_ROUNDS" value="4" /> <env name="CACHE_DRIVER" value="array" /> <env name="DB_CONNECTION" value="sqlite" /> <env name="DB_DATABASE" value=":memory:" /> <env name="MAIL_MAILER" value="array" /> <env name="PULSE_ENABLED" value="false" /> <env name="QUEUE_CONNECTION" value="sync" /> <env name="SESSION_DRIVER" value="array" /> <env name="TELESCOPE_ENABLED" value="false" /> </php> </phpunit>
Créer un test d'intégration :
php artisan make:test TaskApiTest
Dans le fichier tests/Feature/TaskApiTest.php, implémentez les tests :
<?php namespace Tests\Feature; use App\Models\Task; use Illuminate\Foundation\Testing\RefreshDatabase; use Tests\TestCase; class TaskApiTest extends TestCase { use RefreshDatabase; public function test_can_create_task(): void { $response = $this->postJson('/api/tasks', [ 'title' => 'New Task', 'description' => 'Task Description', 'completed' => false, ]); $response->assertStatus(201); $response->assertJson([ 'title' => 'New Task', 'description' => 'Task Description', 'completed' => false, ]); } public function test_can_list_tasks() { Task::factory()->count(3)->create(); $response = $this->getJson('/api/tasks'); $response->assertStatus(200); $response->assertJsonCount(3); } public function test_can_show_task() { $task = Task::factory()->create(); $response = $this->getJson("/api/tasks/{$task->id}"); $response->assertStatus(200); $response->assertJson([ 'title' => $task->title, 'description' => $task->description, 'completed' => false, ]); } public function test_can_update_task() { $task = Task::factory()->create(); $response = $this->putJson("/api/tasks/{$task->id}", [ 'title' => 'Update Task', 'description' => 'Update Description', 'completed' => true, ]); $response->assertStatus(201); $response->assertJson([ 'title' => 'Update Task', 'description' => 'Update Description', 'completed' => true, ]); } public function test_can_delete_task() { $task = Task::factory()->create(); $response = $this->deleteJson("/api/tasks/{$task->id}"); $response->assertStatus(204); $this->assertDatabaseMissing('tasks', ['id' => $task->id]); } }
Lancer les tests :
php artisan test
*Merci ! *
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!