Tech Starlog

LaravelでAPIを作成する手順

投稿日:2026/01/21

本記事では、シンプルな「タスク(Task)」APIを例に、CRUD APIを作成します。
実際にAPIを設計・実装・動作確認するまでの流れを解説します。


前提条件

  • Laravelプロジェクト作成済み(本記事はLaravel12)
  • データベース接続設定済み
  • php artisan migrate が実行できる状態
  • ローカルサーバー or Docker環境が起動している

※環境構築手順は本記事では扱いません。


今回作成するAPI仕様

項目 内容
リソース Task
エンドポイント /api/tasks
機能 一覧取得 / 詳細取得 / 新規作成 / 更新 / 削除
データ形式 JSON

① モデル・マイグレーション作成

まずはTaskモデルとテーブルを作成します。

php artisan make:model Task -m

作成されたマイグレーションファイルを以下の通り編集します。

public function up(): void
{
    Schema::create('tasks', function (Blueprint $table) {
        $table->id();
        $table->string('title');
        $table->text('description')->nullable();
        $table->boolean('is_completed')->default(false);
        $table->timestamps();
    });
}

マイグレーションを実行します。

php artisan migrate

② APIコントローラー作成

API専用コントローラーを作成します。

php artisan make:controller Api/TaskController --api

③ ルーティング設定

③-1 api.phpの作成

route/api.phpがない場合は作成する。

touch routes/api.php

③-2 bootstrap/app.phpの修正

api.phpを追加した場合は、以下の通り修正する。
追加箇所は、**api: DIR.'/../routes/api.php',**の箇所。

修正前

<?php

use Illuminate\Foundation\Application;
use Illuminate\Foundation\Configuration\Exceptions;
use Illuminate\Foundation\Configuration\Middleware;

return Application::configure(basePath: dirname(__DIR__))
    ->withRouting(
        web: __DIR__.'/../routes/web.php',
        commands: __DIR__.'/../routes/console.php',
        health: '/up',
    )
    ->withMiddleware(function (Middleware $middleware): void {
        //
    })
    ->withExceptions(function (Exceptions $exceptions): void {
        //
    })->create();

修正後

<?php

use Illuminate\Foundation\Application;
use Illuminate\Foundation\Configuration\Exceptions;
use Illuminate\Foundation\Configuration\Middleware;

return Application::configure(basePath: dirname(__DIR__))
    ->withRouting(
        web: __DIR__.'/../routes/web.php',
        api: __DIR__.'/../routes/api.php',
        commands: __DIR__.'/../routes/console.php',
        health: '/up',
    )
    ->withMiddleware(function (Middleware $middleware): void {
        //
    })
    ->withExceptions(function (Exceptions $exceptions): void {
        //
    })->create();

ルーティングの追加

routes/api.php にルーティングを追加します。

<?php

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

/*
|--------------------------------------------------------------------------
| API Routes
|--------------------------------------------------------------------------
|
| Here is where you can register API routes for your application.
|
*/

Route::apiResource('tasks', TaskController::class);

これでCRUD用のAPIルートが自動生成されます。

GET    /api/tasks
GET    /api/tasks/{task}
POST   /api/tasks
PUT    /api/tasks/{task}
DELETE /api/tasks/{task}

④ Modelのfillable設定

Mass Assignment対策として、fillable を設定します。

// app/Models/Task.php
protected $fillable = [
    'title',
    'description',
    'is_completed',
];

⑤ コントローラー実装

app/Http/Controllers/Api/TaskController.php を編集します。

<?php

namespace App\Http\Controllers\Api;

use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use App\Models\Task;

class TaskController extends Controller
{
    public function index()
    {
        return response()->json(Task::all());
    }

    public function store(Request $request)
    {
        $task = Task::create(
            $request->only(['title', 'description', 'is_completed'])
        );

        return response()->json($task, 201);
    }

    public function show(Task $task)
    {
        return response()->json($task);
    }

    public function update(Request $request, Task $task)
    {
        $task->update(
            $request->only(['title', 'description', 'is_completed'])
        );

        return response()->json($task);
    }

    public function destroy(Task $task)
    {
        $task->delete();
        return response()->json(null, 204);
    }
}

⑥ バリデーション追加(必須)

最低限のバリデーションを追加します。

public function store(Request $request)
{
    $validated = $request->validate([
        'title' => 'required|max:255',
        'description' => 'nullable|string',
        'is_completed' => 'boolean',
    ]);

    $task = Task::create($validated);

    return response()->json($task, 201);
}

※ update も同様にバリデーションを設定すると安全です。


⑦ APIレスポンス整形(Resource)

実務ではレスポンス形式を統一するのがおすすめです。

php artisan make:resource TaskResource
// app/Http/Resources/TaskResource.php
public function toArray($request)
{
    return [
        'id' => $this->id,
        'title' => $this->title,
        'description' => $this->description,
        'is_completed' => $this->is_completed,
        'created_at' => $this->created_at?->format('Y-m-d H:i'),
    ];
}

コントローラー側:

use App\Http\Resources\TaskResource;

public function index()
{
    return TaskResource::collection(Task::all());
}

⑧ 動作確認(curl例)

▶ 一覧取得

curl http://localhost:8080/api/tasks

▶ 新規作成

curl -X POST http://localhost:8080/api/tasks \
  -H "Content-Type: application/json" \
  -d '{"title":"テストタスク","description":"本文","is_completed":false}'

⑨ よくあるエラーと対処

🔴 419 CSRFエラー

→ APIは、api.php配下なので基本的にCSRF不要。 Webルートに書いていないか確認。

🔴 MassAssignmentException

$fillable 設定漏れ。

🔴 404 Not Found

→ ルーティングキャッシュをクリア。

php artisan route:clear

まとめ

シンプルなCRUD APIであれば、以下の手順で作成できます。

  • モデル作成
  • APIルート定義
  • コントローラー実装
  • バリデーション実装
  • レスポンス整形