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ルート定義
- コントローラー実装
- バリデーション実装
- レスポンス整形