laravel:form-requests について
バリデーションと認可をコントローラーから分離するLaravel開発者向けのフォームリクエストガイドです。ネストしたデータのルール、厳格な入力チェック、テスト方法を扱います。
主な機能
- 01Form Requestにバリデーションを集約
- 02authorizeでアクセスを制御
- 03ネストした配列フィールドを検証
- 04ルールとエラーメッセージをカスタマイズ
- 05未宣言の入力フィールドを拒否
活用シーン
- 01コントローラーの検証を専用リクエストクラスへ移す
- 02ネストしたフォームデータを検証
- 03開発やCIで余分な入力フィールドを検出
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ jpcaparas/ superpowers-laravel --skill laravel:form-requestsインストール後、Claude Code で/laravel:form-requestsを入力して読み込まれたか確認します。
詳細
フォームリクエストとバリデーション
バリデーションと認可を専用のフォームリクエストクラスに移します。コントローラーはオーケストレーションとドメインの意図に集中させます。
コマンド
# Create a request
sail artisan make:request UpdateProfileRequest # or: php artisan make:request UpdateProfileRequest
# Use in controller method signature
public function update(UpdateProfileRequest $request) {
$data = $request->validated();
// ...
}
パターン
- アクセス制御には
authorize()を定義し、複雑なチェックにはポリシーを優先します - ルールオブジェクトを使用します:
Rule::unique('users', 'email')->ignore($user->id) - ネストされた配列をバリデーションします:
items.*.sku、addresses.home.city - オプションのフィールドには、
sometimesではなくnullableと具体的なルールを優先します attributes()とmessages()を使用して、属性名とメッセージを標準化します- 共通ルールはカスタムの
Ruleクラスまたはトレイトに集約します - 部分更新を意図する場合は、
$request->safe()->only([...])を返します
Laravel 13+
// Strict mode: reject undeclared input fields
use Illuminate\Foundation\Http\Attributes\FailOnUnknownFields;
#[FailOnUnknownFields]
class StoreUserRequest extends FormRequest { /* ... */ }
// Or globally (AppServiceProvider) — strict in non-production
FormRequest::failOnUnknownFields(! app()->isProduction());
// Validate arbitrary JSON payloads against a schema
use Illuminate\JsonSchema\Types\Type;
$request->validate([
'data' => [Rule::jsonSchema(Type::object([
'name' => Type::string()->required(),
'age' => Type::integer()->min(0),
]))],
]);
// Typed enum handling for optional input
$request->whenFilledEnum('status', Status::class, fn (Status $status) => /* ... */);
- 開発環境/CI で厳格モードを有効にし、タイプミスやペイロードの不整合を早期に検出します。API コントラクトが厳格な場合を除き、本番環境では寛容な設定を維持します
テスト
- エンドポイントの機能テストを行います:バリデーションエラーと成功時のフローを検証します
- カスタムバリデーターとルールオブジェクトは、単体でユニットテストします
コメント
Markdown 対応