Hallo! In diesem Tutorial erstellen wir eine vollständige REST-API in Laravel, um Aufgaben zu verwalten. Ich führe Sie durch die grundlegenden Schritte, von der Einrichtung des Projekts bis zur Erstellung automatisierter Tests.
Erstellen Sie ein neues Laravel-Projekt:
composer create-project laravel/laravel task-api cd task-api code .
Konfigurieren Sie die Datenbank:
Legen Sie in der .env-Datei Ihre Datenbankkonfigurationen fest:
DB_DATABASE=task_api DB_USERNAME=your_username DB_PASSWORD=your_password
Erstellen Sie die Aufgabentabelle:
Führen Sie den Befehl aus, um eine neue Migration für die Aufgabentabelle zu erstellen:
php artisan make:migration create_tasks_table --create=tasks
Definieren Sie in der Migrationsdatei (database/migrations/xxxx_xx_xx_create_tasks_table.php) die Tabellenstruktur:
<?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'); } };
Führen Sie die Migration aus, um die Tabelle zu erstellen:
php artisan migrate
Erstellen Sie das Modell und den Controller für die Aufgabe:
php artisan make:model Task php artisan make:controller TaskController --api
Definieren Sie das Aufgabenmodell (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']; }
Fügen Sie in der Datei „routes/api.php“ die Routen für den TaskController hinzu:
<?php use App\Http\Controllers\TaskController; use Illuminate\Support\Facades\Route; Route::apiResource('tasks', TaskController::class);
Im TaskController implementieren wir die grundlegenden CRUD-Methoden.
<?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); } }
Jetzt testen wir jeden Endpunkt manuell mit einer VS Code-Erweiterung namens REST Client (https://marketplace.visualstudio.com/items?itemName=humao.rest-client). Wenn Sie möchten, können Sie auch Insomnia oder Postman!
verwendenErstellen Sie nach der Installation der Erweiterung eine .http-Datei in Ihrem Projektordner mit folgendem Inhalt:
### 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
Mit dieser Datei können Sie Anfragen mithilfe der Erweiterung REST Client direkt aus VS Code senden, sodass Sie jede Route in Ihrer API ganz einfach testen können.
Als nächstes erstellen wir Tests, um sicherzustellen, dass jede Route wie erwartet funktioniert.
Erstellen Sie zunächst eine Factory für das Aufgabenmodell:
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, ]; } }
PHPUnit-Konfiguration:
<?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>
Erstellen Sie einen Integrationstest:
php artisan make:test TaskApiTest
Implementieren Sie in der Datei „tests/Feature/TaskApiTest.php“ die 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]); } }
Führen Sie die Tests durch:
php artisan test
*Vielen Dank! *
Das obige ist der detaillierte Inhalt vonSo erstellen Sie eine REST-API mit Laravel. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!