L

フォームリクエストでバリデーションを整理する

コントローラが太りがちなバリデーションを専用クラス「フォームリクエスト」に切り出し、すっきり整理する方法を学びます。

広告枠(記事上)— 本番では AdSense 広告が表示されます

前の単元では、コントローラの中で $request->validate([...]) を書きました。これでも動きますが、ルールが増えたり、同じルールを複数の場所で使ったりすると、コントローラがどんどん太って読みにくくなります。

そこで、バリデーションのルールを専用のクラスにまとめるのが フォームリクエスト です。

フォームリクエストを作る

make:request コマンドで作成します。

php artisan make:request StorePostRequest

app/Http/Requests/StorePostRequest.php が作られます。中には authorize()rules() の2つのメソッドがあります。

class StorePostRequest extends FormRequest
{
    public function authorize(): bool
    {
        return true;
    }

    public function rules(): array
    {
        return [
            'title' => ['required', 'max:255'],
            'body'  => ['required'],
        ];
    }
}
  • rules() … バリデーションのルールをここに書く(前の単元で validate() に渡していた内容そのもの)。
  • authorize() … 「このリクエストを許可するか」。今は誰でも送信OKなので true を返します(認可は第7章で学びます)。

authorize() は最初 true にしておくfalse のままだと送信が拒否(403エラー)されてしまうので注意してください。

コントローラで使う

あとは、コントローラのメソッドの引数を Request から 作ったクラスに置き換えるだけです。

use App\Http\Requests\StorePostRequest;

public function store(StorePostRequest $request)
{
    // ここに来た時点で、すでにバリデーション済み
    $validated = $request->validated();

    \App\Models\Post::create($validated);

    return redirect('/posts');
}

引数を StorePostRequest にすると、メソッドの中身が実行される前に自動でバリデーションが行われます。失敗すれば自動で前の画面に戻るのは前の単元と同じです。コントローラからルールが消えて、とてもすっきりしました。

$request->validated() で、検証を通った値だけを受け取れます。

どちらを使えばいい?

  • ルールが少なく単純 → コントローラ内の $request->validate([...]) で十分。
  • ルールが多い・再利用したい・コントローラを軽くしたい → フォームリクエスト

迷ったら、まずは小さく validate() で書き、複雑になってきたらフォームリクエストへ移す、という流れで問題ありません。

まとめ

  • フォームリクエストは、バリデーションのルールを専用クラスに切り出す仕組み。
  • make:request 名前 で作成し、rules() にルール、authorize() は最初 true
  • コントローラの引数を作ったクラスに変えるだけで、自動でバリデーションされる。
  • 検証済みの値は $request->validated() で受け取る。
  • 第6章は完了です。次章では、ログイン機能=認証を導入します。
広告枠(記事下)— 本番では AdSense 広告が表示されます