こんにちは!
今回は「Laravelを使ってAPIを開発する方法」を解説していきます。
今回はTodoリストを作成しながら、Laravelを使ったAPI開発の基本を学んでいきます。API開発と聞くと難しく感じるかもしれませんが、実際はそんなに難しくはありません。本記事を読んでいただければ、従来の書き方とほとんど違いがないことがわかるでしょう。
それでは、早速みていきましょう!
Laravelを使ったAPI作成方法
今回は、下図のようなテーブルを持つTodoリストアプリケーションを作成します。
todos
テーブル
id | title | body | created_at | updated_at |
1 | お買い物 | お魚、お肉、レタス、卵、ハムを買う。 | 2024-09-24 12:00:00 | 2024-09-24 12:00:00 |
マイグレーション
まずは、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について知らない方は、以下の記事が参考になります。

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リソースを使えば、レスポンス形式を統一できる
コメント