Laravelを使ったRESTful API作成ガイド

Laravel

こんにちは!

今回は「Laravelを使ってAPIを開発する方法」を解説していきます。

今回はTodoリストを作成しながら、Laravelを使ったAPI開発の基本を学んでいきます。API開発と聞くと難しく感じるかもしれませんが、実際はそんなに難しくはありません。本記事を読んでいただければ、従来の書き方とほとんど違いがないことがわかるでしょう。

それでは、早速みていきましょう!

Laravelを使ったAPI作成方法

今回は、下図のようなテーブルを持つTodoリストアプリケーションを作成します。

todosテーブル

idtitlebodycreated_atupdated_at
1お買い物お魚、お肉、レタス、卵、ハムを買う。2024-09-24 12:00:002024-09-24 12:00:00
todosテーブル

マイグレーション

まずは、todosテーブルを作成します。

$ php artisan make:migration create_todos_table

マイグレーションファイルは以下のように編集します。

Schema::create('todos', function (Blueprint $table) {
    $table->id();
    $table->string('title');
    $table->text('body')->nullable();
    $table->timestamps();
});

最後に、マイグレートします。

$ php artisan migrate

ルーティング

Laravel11系の場合は、以下のコマンドでroutes/api.phpを作成します。

$ php artisan install:api

ルーティングファイルは以下のようになります。

<?php

use Illuminate\Http\Request;
use Illuminate\Support\Facades\Route;
use App\Http\Controllers\Api\TodoController;

// Todoリストのルート
Route::apiResource('todos', TodoController::class);

apiResourceと書くと、CRUDに必要なルートを自動的に作成してくれます。

コントローラ

それでは、次にコントローラを作成していきます。普通にmake:controllerコマンドで作成しても良いですが、--apiオプションをつけると、RESTful APIに必要なメソッドを自動的に作成してくれます。

$ php artisan make:controller Api/TodoController --api

コントローラは以下のように記述します。

<?php

namespace App\Http\Controllers\Api;

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

class TodoController extends Controller
{
    /**
     * Display a listing of the resource.
     */
    public function index()
    {
        // 全てのTodoを取得
        $todos = Todo::all();
        return response()->json($todos);
    }

    /**
     * Store a newly created resource in storage.
     */
    public function store(Request $request)
    {
        // リクエストのバリデーション
        $request->validate([
            'title' => 'required|string|max:255',
            'body' => 'nullable|string',
        ]);

        // Todoを作成
        $todo = new Todo();
        $todo->title = $request->title;
        $todo->body = $request->body;
        $todo->save();

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

    /**
     * Display the specified resource.
     */
    public function show(int $id)
    {
        // IDでTodoを取得
        $todo = Todo::findOrFail($id);
        return response()->json($todo);
    }

    /**
     * Update the specified resource in storage.
     */
    public function update(Request $request, int $id)
    {
        // リクエストのバリデーション
        $request->validate([
            'title' => 'required|string|max:255',
            'body' => 'nullable|string',
        ]);

        // IDでTodoを取得
        $todo = Todo::findOrFail($id);
        $todo->title = $request->title;
        $todo->body = $request->body;
        $todo->save();

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

    /**
     * Remove the specified resource from storage.
     */
    public function destroy(string $id)
    {
        // IDでTodoを取得
        $todo = Todo::findOrFail($id);
        $todo->delete();

        return response()->json(null, 204);
    }
}

APIでは基本的にJSONでデータのやり取りを行うので、responseヘルパーのjsonメソッドを使うことで簡単にJSON形式に変換することができます。

jsonメソッドの第二引数で、レスポンス時のステータスコードを指定することができます。

動作確認

それでは、Postmanを使って動作確認を行っていきます。Postmanについて知らない方は、以下の記事が参考になります。

Postman 入門

Todo作成

Todoリスト取得

Todo取得

ID: 2のデータを取得

Todo更新

ID: 2のデータを更新

補足

「APIリソース」を使うと、APIのレスポンス形式を統一することができます。

$ php artisan make:resource TodoResource

TodoResourceクラスのtoArrayメソッドにレスポンス形式を定義することができます。

public function toArray($request)
{
    return [
        'id' => $this->id,
        'title' => $this->title,
        'body' => $this->body,
        'created_at' => $this->created_at,
        'updated_at' => $this->updated_at,
    ];
}

あとは、以下のようにコントローラなどで使えばOKです。

use App\Http\Resources\TodoResource;

public function show($id)
{
    $todo = Todo::findOrFail($id);
    return new TodoResource($todo);
}

複数のTodoを取得する場合は、TodoResource::collectionメソッドを使います。

public function index()
{
    $todos = Todo::all();
    return TodoResource::collection($todos);
}

まとめ

はい、それではまとめます。

  • --apiオプションでRESTful APIコントローラの雛形を作成できる
  • LaravelをAPIとして使う場合は、レスポンスをJSON形式で返す
  • APIリソースを使えば、レスポンス形式を統一できる

コメント

タイトルとURLをコピーしました