mcpField
L
laravel-api

laravel-api

github.com/fusengine開発3578 回インストール1 週間前に更新
リポジトリ

laravel-api について

LaravelでRESTful APIを構築する開発者向けスキルです。ResourceによるJSON応答、入力検証、認証、バージョン管理、ページネーション、レート制限、外部HTTP呼び出しを扱います。

主な機能

  1. 01API ResourceによるJSON応答
  2. 02Sanctum認証
  3. 03Form Requestによる入力検証
  4. 04バージョン付きルートとレート制限
  5. 05オフセット・カーソルページネーション
  6. 06外部API向けHTTPクライアント

活用シーン

  1. 01バージョン付きRESTエンドポイントの構築
  2. 02API入力の検証と認可
  3. 03大量のAPI結果のページ分割
  4. 04HTTP経由で外部サービスを利用

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/fusengine/claude-plugins --skill laravel-api

インストール後、Claude Code で/laravel-apiを入力して読み込まれたか確認します。

同梱ファイル

SKILL.md と一緒にインストールされる参考資料やスクリプト。

references/
controllers.md
http-client.md
middleware.md
pagination.md
rate-limiting.md
redirects.md
requests.md
responses.md
routing.md
strings.md
urls.md
validation.md
references/templates/
api-routes.md
ApiController.php.md
ApiResource.php.md
FormRequest.php.md
HttpClientService.php.md
routing-examples.md
validation-rules.md

詳細

Laravel を使用した RESTful API の構築を扱います。API リソースによるレスポンス変換、Sanctum 認証、レート制限、ルートのバージョニング、Form Request によるバリデーション、ページネーション(オフセット/カーソル)、HTTP クライアントを介した外部 API の利用を網羅します。(スパースフィールドセット、インクルード、リンクに対応した)JSON:API 仕様準拠のエンドポイントについては、代わりに laravel-jsonapi を参照してください。

Laravel API 開発

エージェントのワークフロー(必須)

実装の前に、必ず 3 つのエージェントを並列で起動してください。それぞれ name を指定して、Agent を 1 回ずつ呼び出します。

  1. fuse-ai-pilot:explore-codebase - 既存の API パターンを分析します
  2. fuse-ai-pilot:research-expert - Context7 を使って Laravel の API ドキュメントを確認します
  3. mcp__context7__query-docs - API リソースと Sanctum のパターンを確認します

実装後、検証のために fuse-ai-pilot:sniper を実行してください。


概要

Laravel で API リソースを使用してレスポンスを変換し、Sanctum で認証する RESTful API を構築します。

コンポーネント目的
コントローラーリクエストを処理し、サービスに委譲します
Form Request入力を検証し、アクションを認可します
API リソースモデルを JSON に変換します
ミドルウェア認証、レート制限、CORS
ルートグループ化されたバージョン管理済みエンドポイント
ページネーションオフセット/カーソルページネーション
HTTP クライアント外部 API を利用します

重要なルール

  1. 常に API リソースを使用する - Eloquent モデルを直接返さないでください
  2. ルートをバージョン管理する - /v1/、/v2/ をプレフィックスとして付けます
  3. すべての入力を検証する - インラインバリデーションではなく、Form Request を使用します
  4. レート制限 - ルートごとに制限を設定します
  5. 一貫性のあるレスポンス - 同じ構造と適切なステータスコードを使用します
  6. サービスを使用する - コントローラーを薄く保ちます
  7. Eager Load する - ページネーションの前に with() を使い、N+1 を防ぎます

リファレンスガイド

コアコンセプト
トピックリファレンス参照するタイミング
ルーティングrouting.mdバージョン管理された API ルートの定義
コントローラーcontrollers.mdコントローラーパターン、リソースメソッド
ミドルウェアmiddleware.mdルートの保護、リクエストのフィルタリング
バリデーションvalidation.mdForm Request、バリデーションルール
リクエスト/レスポンス
トピックリファレンス参照するタイミング
リクエストrequests.md入力、ファイル、ヘッダーへのアクセス
レスポンスresponses.mdAPI リソース、ステータスコード
ページネーションpagination.mdオフセット/カーソルページネーション
高度なトピック
トピックリファレンス参照するタイミング
レート制限rate-limiting.mdスロットル設定
HTTP クライアントhttp-client.md外部 API の利用
URLurls.mdURL の生成、署名付き URL
文字列strings.md文字列ヘルパー、UUID、スラッグ
リダイレクトredirects.mdリダイレクトレスポンス

テンプレート(コード例)
コントローラーとルート
テンプレート目的
ApiController.php.mdサービスを含む CRUD コントローラー一式
api-routes.mdミドルウェアを含むバージョン管理済みルート
routing-examples.md詳細なルーティングパターン
バリデーションとリソース
テンプレート目的
FormRequest.php.mdStore/Update Form Request
validation-rules.mdすべてのバリデーションルールのリファレンス
ApiResource.php.mdリレーションシップを含むリソース
外部 API
テンプレート目的
HttpClientService.php.md再利用可能な HTTP クライアントサービス

クイックリファレンス

リソースのレスポンス
return PostResource::collection($posts);
return PostResource::make($post);
ステータスコード
return PostResource::make($post)->response()->setStatusCode(201);
return response()->json(null, 204);
フォームリクエスト
public function store(StorePostRequest $request): JsonResponse
{
    $post = $this->service->create($request->validated());
    return PostResource::make($post)->response()->setStatusCode(201);
}
レート制限
Route::middleware('throttle:60,1')->group(fn () => ...);
バージョン付きルート
Route::prefix('v1')->group(function () {
    Route::apiResource('posts', PostController::class);
});
ページネーション
return PostResource::collection(Post::paginate(15));

機能一覧

機能状態リファレンス
RESTful コントローラー✅controllers.md
API リソース✅responses.md
フォームリクエストのバリデーション✅validation.md
ルートのバージョン管理✅routing.md
ルートモデルバインディング✅routing.md
ミドルウェア✅middleware.md
レート制限✅rate-limiting.md
ページネーション✅pagination.md
カーソルページネーション✅pagination.md
HTTP クライアント✅http-client.md
署名付き URL✅urls.md
JSON レスポンス✅responses.md

Laravel 13 に関する注意事項

API リソースの属性

Laravel 13 では、PHP 属性を使用して ResourceCollection を設定するための #[Collects] と #[PreserveKeys] が導入されています。

use Illuminate\Http\Resources\Json\ResourceCollection;
use Illuminate\Http\Resources\Attributes\Collects;
use Illuminate\Http\Resources\Attributes\PreserveKeys;

#[Collects(PostResource::class)]
#[PreserveKeys]
final class PostCollection extends ResourceCollection {}
JSON:API 準拠

JSON:API API(スパースフィールドセット、インクルード、リンク)については、?include=、?fields[type]=、仕様に準拠したページネーションを扱う [[laravel-jsonapi]] を参照してください。

ベストプラクティス

実施すること
  • すべての公開 JSON レスポンスに API リソース(JsonResource)を使用する
  • ヘッダーではなく URL(/api/v1)でバージョン管理する(可読性が高く、キャッシュ可能です)
  • ユーザーごと、かつ IP ごとにレート制限する(throttle:60,1 + カスタムリミッター)
  • エンドポイントを実装する前に OpenAPI/Scribe でドキュメントを作成する
  • 大きなリストには cursor() ページネーションを優先する(安定しており、高パフォーマンスです)
実施しないこと
  • Eloquent モデルを直接返さない(機密性の高いカラムが漏えいします)
  • HTTP ステータスを混同しない(バリデーションには常に 422 を使用し、401 と 403 を使い分けます)
  • フォームリクエストのバリデーションを省略しない(コントローラー内では決してバリデーションしません)
  • 自動採番 ID を公開しない(UUID/ULID を優先します)
  • 外部 Webhook 用の PreventRequestForgery の例外設定を忘れない

コメント