Laravel을 사용하여 REST API를 만드는 방법

Patricia Arquette
풀어 주다: 2024-10-30 23:26:30
원래의
891명이 탐색했습니다.

How to Create REST API Using Laravel

안녕하세요! 이 튜토리얼에서는 작업을 관리하기 위해 Laravel에서 완전한 REST API를 구축할 것입니다. 프로젝트 설정부터 자동화된 테스트 생성까지 기본 단계를 안내해 드리겠습니다.

1단계: 프로젝트 설정

새 Laravel 프로젝트 만들기:

composer create-project laravel/laravel task-api
cd task-api
code .
로그인 후 복사

데이터베이스 구성:
.env 파일에서 데이터베이스 구성을 설정합니다.

DB_DATABASE=task_api
DB_USERNAME=your_username
DB_PASSWORD=your_password
로그인 후 복사

작업 테이블 생성:
작업 테이블에 대한 새 마이그레이션을 생성하려면 다음 명령을 실행하세요.

php artisan make:migration create_tasks_table --create=tasks
로그인 후 복사

마이그레이션 파일(database/migrations/xxxx_xx_xx_create_tasks_table.php)에서 테이블 구조를 정의합니다.

<?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');
    }
};
로그인 후 복사

마이그레이션을 실행하여 테이블을 만듭니다.

php artisan migrate
로그인 후 복사

2단계: 모델 및 컨트롤러 생성

작업에 대한 모델 및 컨트롤러 만들기:

php artisan make:model Task
php artisan make:controller TaskController --api
로그인 후 복사

작업 모델 정의(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'];
}
로그인 후 복사

3단계: API 경로 정의

routes/api.php 파일에서 TaskController에 대한 경로를 추가합니다.

<?php

use App\Http\Controllers\TaskController;
use Illuminate\Support\Facades\Route;

Route::apiResource('tasks', TaskController::class);
로그인 후 복사

4단계: TaskController에서 CRUD 구현

TaskController에서 기본 CRUD 메소드를 구현하겠습니다.

<?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);
    }
}
로그인 후 복사

5단계: 끝점 테스트(VS Code)

이제 REST 클라이언트(https://marketplace.visualstudio.com/items?itemName=humao.rest-client)라는 VS Code 확장을 사용하여 각 엔드포인트를 수동으로 테스트하겠습니다. 원한다면 불면증이나 Postman을 이용해도 됩니다!

확장 프로그램을 설치한 후 프로젝트 폴더에 다음 내용이 포함된 .http 파일을 생성하세요.

### 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
로그인 후 복사

이 파일을 사용하면 REST 클라이언트 확장을 사용하여 VS Code에서 직접 요청을 보낼 수 있으므로 API에서 각 경로를 쉽게 테스트할 수 있습니다.

6단계: API 테스트

다음으로 각 경로가 예상대로 작동하는지 확인하는 테스트를 만들어 보겠습니다.

먼저 작업 모델을 위한 팩토리를 만듭니다.

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 구성:

<?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>
로그인 후 복사

통합 테스트 만들기:

php artisan make:test TaskApiTest
로그인 후 복사

tests/Feature/TaskApiTest.php 파일에서 다음 테스트를 구현합니다.

<?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]);
    }
}
로그인 후 복사

테스트 실행:

php artisan test
로그인 후 복사

*감사합니다! *

위 내용은 Laravel을 사용하여 REST API를 만드는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:dev.to
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿