laravel:specifying-constraints について
Laravel のコーディングエージェント向けに、性能、セキュリティ、テスト、アーキテクチャ、依存関係の要件を具体的な制約として記述する方法を示すスキルです。
主な機能
- 01性能とデータベースの例
- 02セキュリティ要件の例
- 03テスト要件とテンプレート
- 04アーキテクチャパターンの制約
- 05依存関係と互換性の要件
活用シーン
- 01検索の応答時間と同時利用数の目標設定
- 02API の検証、認可、データ保護の指定
- 03テスト範囲と境界ケースの定義
- 04決済機能のレイヤー構成の指定
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ jpcaparas/ superpowers-laravel --skill laravel:specifying-constraintsインストール後、Claude Code で/laravel:specifying-constraintsを入力して読み込まれたか確認します。
詳細
制約の指定
制約を設けることで、プロジェクトに適した解決策を AI に導けます。制約がなければ、要件を満たさない一般的なコードが生成される可能性があります。
パフォーマンスの制約
あいまいな例
「速くしてください」
具体的な例
「商品検索を最適化してください。
- 95 パーセンタイルの応答時間を 200ms 未満にする
- 1000 人の同時ユーザーに対応する
- Redis を使用して結果を 5 分間キャッシュする
name、category_id、published_atにデータベースインデックスを使用する- 結果をページネーションし、1 ページあたりの上限を 50 件にする
- Eager Loading を使用して N+1 クエリを回避する」
データベースのパフォーマンス
「パフォーマンスの制約に従って注文をクエリしてください。
- 必要な列のみを読み込むために
select()を使用する items、customer、shipping_addressを 1 回のクエリで Eager Loading する(user_id, created_at, status)に複合インデックスを追加する- 1000 件を超えるレコードのバッチ処理には
chunk()を使用する - クエリのタイムアウトを 5 秒に設定する」
セキュリティの制約
あいまいな例
「安全にしてください」
具体的な例
「次のセキュリティ要件に従って、ユーザープロフィールの更新機能を実装してください。
ProfilePolicy@updateを使用して認可するProfileUpdateRequestですべての入力を検証する- bio フィールドの HTML をサニタイズする(スクリプトを除去し、基本的な書式は許可する)
- ユーザーごとに 1 分あたり 10 リクエストにレート制限する
- bcrypt(コスト係数 12)でパスワードをハッシュ化する
- 監査証跡として、プロフィールの変更をすべて記録する
$fillableを使用してマスアサインメントの脆弱性を防ぐ」
API のセキュリティ
「決済 API を保護してください。
auth:sanctumミドルウェアを必須にする- API トークンが
process-payments権限を持つことを検証する - HTTPS のみを使用する(ミドルウェアで強制する)
- 決済プロバイダーからの Webhook 署名を検証する
- 機密データをデータベースに暗号化して保存する
- クレジットカード番号やトークンは絶対にログに記録しない
- 汎用的なエラーメッセージを返す(システムの詳細を漏らさない)」
テストの制約
あいまいな例
「テストを追加してください」
具体的な例
「注文処理機能をテストしてください。
- 注文フロー全体(作成 → 処理 → 確認)のフィーチャーテスト
- OrderService の各メソッドのユニットテスト
- バリデーションエラーをテストする(無効な決済、在庫不足)
- エッジケースをテストする(数量がゼロ、価格がマイナス)
- 外部の決済ゲートウェイをモックする
- テストデータにはファクトリーを使用する
- ビジネスロジックのコードカバレッジ 80% を目指す
- テストは 30 秒未満で実行する」
テスト要件
「認証のテスト要件:
- 有効な認証情報でのログイン成功をテストする
- 無効な認証情報でのログイン失敗をテストする
- レート制限(1 分あたり最大 5 回の試行)をテストする
- 24 時間後のトークンの有効期限切れをテストする
- ログアウトによってトークンが無効化されることをテストする
RefreshDatabaseトレイトを使用する- テストで外部 API を呼び出さない(モックを使用する)」
アーキテクチャ上の制約
従うべきパターン
「次のアーキテクチャに従って決済処理を実装してください。
- リポジトリパターンを使用する:データアクセスには
PaymentRepository - サービスレイヤーを使用する:ビジネスロジックには
PaymentService - 非同期処理にはジョブを使用する:
ProcessPaymentJob - イベントを使用する:
PaymentProcessed、PaymentFailed - コントローラーは処理を組み立てるだけにし、ビジネスロジックを含めない
- メソッドごとのサイクロマティック複雑度を 7 未満に保つ
- SOLID 原則に従う」
避けるべきパターン
「次の制約に従ってユーザー管理を実装してください。
- ビジネスロジックで静的メソッドやファサードを使用しない
- コントローラーやモデルにビジネスロジックを記述しない
- グローバル状態やシングルトンを使用しない
- 関心事を混在させない(バリデーション、ビジネスロジック、永続化を分離する)
- 生の SQL クエリを使用しない(Eloquent または Query Builder を使用する)
- 認可チェックを回避しない」
依存関係の制約
バージョン要件
「画像処理機能を追加してください。
intervention/image^3.0 を使用する(Laravel 13.x 互換)- PHP 8.2 以降が必要
- GD または Imagick 拡張機能が必要
- 既存の
spatie/laravel-medialibrary^11.0 と互換性がある - 現在の依存関係と競合しない」
パッケージの選定
「PDF 生成用のパッケージを選んでください。
- Laravel 13.x をサポートしていること
- UTF-8 と特殊文字を処理できること
- ヘッダー/フッターに対応していること
- 活発にメンテナンスされているものを優先する(過去 6 か月以内に更新されている)
- PHP 8.2 の要件との互換性を確認する
- 候補:
barryvdh/laravel-dompdfまたはspatie/laravel-pdf」
制約テンプレート
パフォーマンステンプレート
- Response time: < X ms
- Throughput: Y requests/second
- Cache strategy: Redis, TTL Z minutes
- Database: indexes on [columns], eager load [relationships]
- Pagination: max X per page
セキュリティテンプレート
- Authentication: [Sanctum/Passport/Session]
- Authorization: [Policy/Gate]
- Validation: [Form Request class]
- Rate limiting: X requests per Y minutes
- Data protection: [encryption/hashing requirements]
- Audit logging: [what to log]
テストテンプレート
- Coverage: X% on business logic
- Test types: [feature/unit/integration]
- Mocking: [external services to mock]
- Factories: [models to factory]
- Performance: tests complete in < X seconds
- Edge cases: [specific scenarios to test]
クイックリファレンス
制約は明確に指定してください:
- パフォーマンス - 応答時間、スループット、キャッシュ、インデックス
- セキュリティ - 認証、検証、レート制限、データ保護
- テスト - カバレッジ、テストの種類、モック、エッジケース
- アーキテクチャ - 従う/避けるべきパターン、複雑さの上限
- 依存関係 - バージョン、互換性、パッケージ要件
制約を明確にすれば、プロジェクトに合ったコードになります。
コメント
Markdown 対応