Contents
Laravel 11 プロジェクトの作成と基本設定
Laravel 11 を API 開発に利用する際は、まず開発環境を正しく構築しておくことが成功の鍵です。このセクションでは Composer でのインストール手順 と .env の最低限の設定項目 を具体的に示します。これらが完了すれば、すぐにルーティングやコントローラの実装へと移行できます。
プロジェクト作成とキー・データベース設定
|
1 2 3 4 5 6 7 8 |
# Laravel 11 の新規プロジェクトを作成(バージョン 11 系統を指定) composer create-project laravel/laravel my-api "11.*" cd my-api # アプリケーションキーの自動生成 php artisan key:generate |
続いて .env にアプリ名・環境情報・データベース接続情報を記入します。以下はローカル開発用の例です。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
cat >> .env <<EOF APP_NAME=MyAPI APP_ENV=local APP_KEY=$(php -r "echo 'base64:' . base64_encode(random_bytes(32));") APP_DEBUG=true APP_URL=http://localhost DB_CONNECTION=mysql DB_HOST=127.0.0.1 DB_PORT=3306 DB_DATABASE=my_api_db DB_USERNAME=root DB_PASSWORD= EOF |
ポイント
-php artisan key:generateが生成したキーは.envのAPP_KEYに自動で書き込まれますが、上記のように手動で設定しても問題ありません。
- データベース情報は実際に使用する環境(MySQL、PostgreSQL 等)に合わせて調整してください。
まとめ
以上の手順だけで Laravel 11 の開発基盤が完成します。次は API 用ルートファイルとミドルウェアグループ の関係を確認し、実装へ進めましょう。
API ルートファイルとミドルウェアグループの仕組み
Laravel 11 のデフォルトスケルトンには routes/api.php が 自動的に生成 されます(Laravel 10 以前から変わりません)。このファイルは RouteServiceProvider によって読み込まれ、api ミドルウェアグループが自動で付与されるため、開発者が個別に web ミドルウェアを意識する必要はありません。
routes/api.php の役割と自動適用ミドルウェア
RouteServiceProvider::mapApiRoutes() が内部で次のように定義されています(Laravel 11 のデフォルト実装)。
|
1 2 3 4 5 6 7 |
protected function mapApiRoutes() { Route::prefix('api') ->middleware('api') // ← ここで api ミドルウェアスタックが付与される ->group(base_path('routes/api.php')); } |
この設定により、routes/api.php に記述した全てのルートは throttle:api・bindings・substituteBindings など を含む api ミドルウェアスタックが自動的に適用されます。したがって、ファイル内で改めて Route::middleware('api') と書く必要は基本的にはありません。
api.php に明示的にミドルウェアを付与するケース
以下のような特殊な要件がある場合にだけ、個別でミドルウェアを上書きしたり追加したりします。
- ルート単位で 認証ガード(例:
auth:sanctum)や カスタムレートリミット を設定したいとき apiグループ以外のミドルウェア(例:cors)を追加したいとき
|
1 2 3 4 5 6 7 |
use Illuminate\Support\Facades\Route; use App\Http\Controllers\Api\HealthCheckController; // 認証が不要なヘルスチェックは個別に middleware を省略できる Route::get('/health', [HealthCheckController::class, 'show']) ->withoutMiddleware(['auth:sanctum']); |
まとめ
routes/api.phpはデフォルトで生成され、apiミドルウェアグループが自動付与されます。- 基本的にファイル内で
Route::middleware('api')を書く必要はありませんが、認証やカスタムミドルウェアを個別に指定したい場合は明示できます。
実践的なルーティング:シンプル定義から apiResource まで
このセクションでは、最小構成のエンドポイント と CRUD 用の自動生成ルート の両方を具体例とともに紹介します。まずは手軽に動作確認できるクロージャベースの実装から始め、続いて本格的なコントローラ駆動のパターンへ移ります。
基本的な GET / POST エンドポイント
routes/api.php に次のコードを追記すれば、簡単な ping エンドポイントとリクエスト内容をそのまま返す echo エンドポイントが完成します。先ほど説明した通り、api ミドルウェアは自動で適用されます。
|
1 2 3 4 5 6 7 8 9 10 11 |
use Illuminate\Http\Request; use Illuminate\Support\Facades\Route; Route::get('/ping', function () { return response()->json(['message' => 'pong']); }); Route::post('/echo', function (Request $request) { return response()->json($request->all()); }); |
ポイント
-Route::getとRoute::postはクロージャでもコントローラメソッドでも同様に使用できます。
- テストやデバッグ時はクロージャが手軽で、実装後はコントローラへリファクタリングすると保守性が向上します。
apiResource を使った CRUD ルートの一括生成
RESTful な API の典型例として ユーザー管理 を考えます。Laravel 11 では Route::apiResource が自動的に index, store, show, update, destroy の5つのアクションを作成します。
- コントローラを API 用テンプレートで生成(
--apiオプションはリソースコレクション系メソッドを除外)
bash
php artisan make:controller Api/UserController --api
routes/api.phpにルート定義を追加
php
use App\Http\Controllers\Api\UserController;
Route::apiResource('users', UserController::class);
- 生成されたルートは次のようになります(
php artisan route:list --path=api/usersで確認可能)
| メソッド | URI | アクション |
|---|---|---|
| GET | /api/users | index |
| POST | /api/users | store |
| GET | /api/users/{user} | show |
| PUT/PATCH | /api/users/{user} | update |
| DELETE | /api/users/{user} | destroy |
注意点
-apiResourceは自動的にapiミドルウェアを使用しますので、別途ラップする必要はありません。
- コントローラメソッドでは型ヒントでモデルバインディングが機能し、余計なRoute::model設定は不要です。
まとめ
- クロージャだけでも数行で GET/POST エンドポイントを実装でき、開発初期の検証に最適です。
- 本格的な CRUD は
apiResourceと API 用コントローラの組み合わせがベストプラクティスとなります。
API の高度化:バージョニング・認証・モデルバインディング
実務で求められる API には バージョン管理、認証保護、そして 型安全なモデルバインディング が欠かせません。ここではそれぞれの実装例とベストプラクティスを示します。
バージョニング(v1, v2 …)
Route::prefix と名前空間の組み合わせでシンプルにバージョン分けができます。Laravel 11 では自動的に PSR‑4 に従うため、コントローラの配置だけで名前空間が解決されます。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
use App\Http\Controllers\Api\V1\UserController; use App\Http\Controllers\Api\V2\UserController as UserV2Controller; Route::prefix('v1') ->group(function () { Route::apiResource('users', UserController::class); }); Route::prefix('v2') ->group(function () { // v2 では追加カラムやロジックが変更されたコントローラを使用 Route::apiResource('users', UserV2Controller::class); }); |
ベネフィット
- エンドポイントはhttps://example.com/api/v1/users、/api/v2/usersと明確に分離でき、将来的な互換性維持が容易です。
認証ミドルウェアの適用例
Laravel 11 が標準で提供する Sanctum はシンプルなトークン認証を実装できます。以下は Sanctum を使った保護ルートのサンプルです。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
use Illuminate\Http\Request; use App\Http\Controllers\Api\AuthController; Route::post('/login', [AuthController::class, 'login']); Route::middleware('auth:sanctum') ->group(function () { Route::get('/profile', function (Request $request) { return $request->user(); }); // 既存の CRUD ルートも同じグループに入れられる Route::apiResource('posts', App\Http\Controllers\Api\PostController::class); }); |
- Passport を利用した OAuth2 認証や、サードパーティ製 JWT パッケージ(
tymon/jwt-auth)でも同様にauth:passportやカスタムミドルウェア名を指定すれば OK です。
改良されたモデルバインディング
Laravel 11 では 暗黙的バインディング が高速化され、明示的な Route::model 呼び出しは不要になりました。コントローラのメソッドで型ヒントを付けるだけです。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
namespace App\Http\Controllers\Api\V1; use App\Models\User; use Illuminate\Http\JsonResponse; class UserController extends Controller { public function show(User $user): JsonResponse { return response()->json($user); } public function update(User $user, Request $request): JsonResponse { $user->update($request->validated()); return response()->json($user); } } |
ポイント
- ルートパラメータ名({user})がモデルの単数形と一致すれば、Laravel が自動で検索・インジェクトします。
- カスタムキー(例:UUID)を使う場合はpublic function getRouteKeyName(): string { return 'uuid'; }をモデルに実装してください。
まとめ
- バージョニングは
prefixと名前空間でシンプルに実装できます。 - 認証は Sanctum がデフォルトで最も手軽ですが、要件に応じて Passport や JWT へ切り替え可能です。
- モデルバインディングは型ヒントだけで完結し、コードが格段に読みやすくなります。
デプロイ・テスト・トラブルシューティング
本番環境で安定稼働させるための キャッシュ管理 と 自動テスト のベストプラクティスをまとめます。特に routes/api.php が存在しない状態で実行するとエラーになるケースについても対処法を示します。
ルーティングキャッシュの使い方と注意点
|
1 2 3 4 5 |
# 本番デプロイ直前の推奨コマンド php artisan config:cache # 設定ファイルをキャッシュ php artisan route:cache # ルート情報をキャッシュ php artisan view:cache # ビューコンパイル結果をキャッシュ |
- 必須条件:
routes/api.phpがプロジェクト内に存在し、正しい PHP 構文で記述されていること。 - キャッシュが古い場合は
php artisan route:clearで削除し、再度route:cacheを実行してください。
PHPUnit と Pest による API テスト例
PHPUnit(tests/Feature/UserApiTest.php)
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
<?php namespace Tests\Feature; use Tests\TestCase; use App\Models\User; use Laravel\Sanctum\Sanctum; class UserApiTest extends TestCase { /** @test */ public function it_returns_user_list() { // 認証が必要な場合は Sanctum で擬似ユーザーを作成 Sanctum::actingAs(User::factory()->create()); $response = $this->getJson('/api/v1/users'); $response->assertOk() ->assertJsonStructure(['data']); } } |
Pest(tests/Feature/UserApiTest.php)
|
1 2 3 4 5 6 7 |
it('gets user list', function () { // 認証が必要なら Sanctum::actingAs() を呼び出す getJson('/api/v1/users') ->assertOk() ->assertJsonPath('data', fn ($d) => expect($d)->toBeArray()); }); |
ベストプラクティス
- テスト実行前に必ずphp artisan route:clearを CI のセットアップ段階で走らせ、キャッシュによる影響を排除します。
routes/api.php がない エラーへの対処法
- 手動作成
プロジェクトのroutesディレクトリに以下の最小構成ファイルを作ります。
php
['message' => 'pong']);
2. **RouteServiceProvider の確認**
app/Providers/RouteServiceProvider.php にある mapApiRoutes() がコメントアウトされていないかチェックします。デフォルトは次の通りです。
php
protected function mapApiRoutes()
{
Route::prefix('api')
->middleware('api')
->group(base_path('routes/api.php'));
}
3. **キャッシュクリア**
ルートファイルを追加・修正した後は必ず php artisan route:clear を実行し、再度 route:cache(必要なら)を行ってください。
### まとめ
* routes/api.php はデフォルトで生成され、api ミドルウェアが自動付与されます。
* キャッシュは本番環境のパフォーマンス向上に有効ですが、ファイル欠損時にはエラーになるため事前確認が必須です。
* テストはキャッシュの影響を排除した状態で実行し、認証が必要な場合は Sanctum 等で擬似ユーザーを作成するとスムーズです。
---
## 全体まとめ
Laravel 11 で API 開発を始める際に最も重要なのは **正しいプロジェクト構築** と **ルート・ミドルウェアの理解** です。本稿では以下のポイントを網羅しました。
1. Composer による Laravel 11 のインストールと .env 設定
2. routes/api.php がデフォルトで生成され、api ミドルウェアが自動付与される仕組み
3. シンプルな GET/POST エンドポイントから apiResource による CRUD の一括生成までの流れ
4. バージョニング・認証(Sanctum 等)・暗黙的モデルバインディングの実装例
5. ルーティングキャッシュ、テスト、そして「ファイルがない」エラーへの対処法
これらを踏まえてプロジェクトをセットアップすれば、**ステートレスかつ高速な API** を即座に構築できるはずです。実装後は必ずテストとキャッシュのクリア・再生成を行い、本番環境へ安全にデプロイしてください。 Happy coding!
?>