フォームリクエストでバリデーションを整理する
コントローラが太りがちなバリデーションを専用クラス「フォームリクエスト」に切り出し、すっきり整理する方法を学びます。
広告枠(記事上)— 本番では 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 広告が表示されます