LaravelでRESTfulアーキテクチャに基づいたCRUD(Create, Read, Update, Delete)
処理を行うコード例を、以下の構成で記述します。
扱うデータはこんな感じのユーザーデータ
users = [{ id: 1, name: "Taro" }, { id: 2, name: "Hanako" }];
✅ 前提
- テーブル名はusers。
- モデル(MVCのM):
Userモデルあり。つまり、Eloquentを使用 - ルーティングは RESTful リソースルート。
- コントローラー(MVCのC):
UserController - Laravelバージョンは9以降を想定。
1. モデル作成(既存)
bashphp artisan make:model User
モデルは以下のように定義(app/Models/User.php)されていると仮定:
phpnamespace App\Models;で扱える設定
use Illuminate\Database\Eloquent\Model;
class User extends Model
{
protected $fillable = ['name']; //nameをUserController
}
2. マイグレーション
phpSchema::create('users', function (Blueprint $table) {
$table->id();
$table->string('name');
$table->timestamps();
});
3. コントローラー作成
bashphp artisan make:controller UserController --resource
app/Http/Controllers/UserController.php に以下のCRUD処理を追加:
phpnamespace App\Http\Controllers;
use App\Models\User;
use Illuminate\Http\Request;
class UserController extends Controller
{
// 一覧取得 (Read - Index)
public function index()
{
return response()->json(User::all());
}
// 単一取得 (Read - Show)
public function show($id)
{
$user = User::findOrFail($id);
return response()->json($user);
}
// 作成 (Create - Store)
public function store(Request $request)
{
$request->validate([
'name' => 'required|string|max:255',
]);
$user = User::create([
'name' => $request->name,
]);
return response()->json($user, 201);
}
// 更新 (Update)
public function update(Request $request, $id)
{
$request->validate([
'name' => 'required|string|max:255',
]);
$user = User::findOrFail($id);
$user->update([
'name' => $request->name,
]);
return response()->json($user);
}
// 削除 (Delete)
public function destroy($id)
{
$user = User::findOrFail($id);
$user->delete();
return response()->json(null, 204);
}
}
4. ルーティング設定
routes/api.php に以下を追加:
phpuse App\Http\Controllers\UserController;
Route::apiResource('users', UserController::class);
5. 動作例
GET /api/users (HTTPリクエストとURL)
json[
{ "id": 1, "name": "Taro" },
{ "id": 2, "name": "Hanako" }
]
POST /api/users
json{ "name": "Jiro" }
PUT /api/users/1
json{ "name": "Taro Updated" }
DELETE /api/users/2
上記のRoute::apiResource()の説明
Route::apiResource() は、
Laravel における RESTful API 向けのルート定義メソッド
で、GET、POST、PUT/PATCH、DELETE のような
標準的な API エンドポイントを一括で登録できます。
✅ 基本構文
phpRoute::apiResource('リソース名', コントローラークラス名);
例:
phpRoute::apiResource('users', UserController::class);
これは、以下の7つのメソッドのうちAPI用途に必要な6つのルート
を自動的に登録します(create と edit は含まれません)。
📘 自動的に登録されるルート一覧
| HTTPメソッド | URIパス | コントローラーメソッド | 説明 |
|---|---|---|---|
| GET | /users | index() | 全ユーザーの一覧取得 |
| GET | /users/{id} | show($id) | 指定IDのユーザーを取得 |
| POST | /users | store(Request $req) | 新規ユーザーを作成 |
| PUT/PATCH | /users/{id} | update(Request $req, $id) | 指定IDのユーザーを更新 |
| DELETE | /users/{id} | destroy($id) | 指定IDのユーザーを削除 |
✏️ 補足
apiResourceは HTML フォーム用のcreate()やedit()メソッド(ビューを返す系)
を含みません。- Webアプリで使う
Route::resource()はすべての7つ(create,edit含む)
を登録します。
🆚 apiResource() vs resource()
| メソッド | 用途 | create/edit含む? |
|---|---|---|
Route::resource() | Web (HTML) | ✅ 含む |
Route::apiResource() | API (JSON) | ❌ 含まない |
🧠 まとめ
Route::apiResource() は、
API設計におけるRESTfulなルーティングを簡潔に記述するためのメソッドで、
API開発で非常によく使われます。
APIはアプリケーション・プログラミング・インターフェース
(Application Programming Interface)の略称
apiResource() の正しい構文:
phpRoute::apiResource('todos', TodoController::class);
- 第一引数はリソース名(複数形の名詞)
- 第二引数はコントローラーのクラス名
apiResource() では {id} をルート定義に含めてはいけません!
→ Laravelが自動で {id} を必要なルートに追加します。
つまり、下記のような記述はNGです。
Route::apiResource('/todos/{todo}', TodoController::class)
✅ 解説:なぜエラーになるのか?
Laravel の apiResource() は以下のようなルートを自動生成します:
| HTTP メソッド | URI | アクション | メソッド名 |
|---|---|---|---|
| GET | /todos | index | index() |
| POST | /todos | store | store() |
| GET | /todos/{todo} | show | show() |
| PUT/PATCH | /todos/{todo} | update | update() |
| DELETE | /todos/{todo} | destroy | destroy() |
'/todos/{todo}' を apiResource() に書いてしまうと、
このようなルーティングとの整合性が崩れ、Laravelが期待するリソースIDの
位置と形式が合わなくなり、結果として不整合な配列→文字列変換が内部で
発生することがあります。
GETでURIが/todos/{todo}でも、Route::apiResource('todos', TodoController::class);
です。
第二引数でも、処理すべき関数を指定したいので、
apiResource() に [TodoController::class, 'TodoJson']
のような配列で書くのも誤りです。
apiResource() は
リソース型のルート群(index, show, store など)を
コントローラーの特定のメソッドに自動でマッピングするため、
個別にメソッド名を指定する配列形式は使えません。

