バリデーションとは
バリデーションとは、ユーザーから送信されたデータが期待する形式や条件を満たしているかを検証することです。 Laravelはリクエストオブジェクトのvalidate メソッドや専用のフォームリクエストクラスを使った、シンプルで強力なバリデーション機能を提供しています。
コントローラーでのバリデーション
$request->validate() の使い方
コントローラーのメソッド内で $request->validate() を呼び出すのが、最もシンプルなバリデーション方法です。
バリデーションに失敗すると、Laravelはユーザーを前の画面に自動でリダイレクトし、エラー情報をセッションに保存します。
ルートを定義します。
validate メソッドにはフィールド名をキー、ルールを値とした配列を渡します。
ルールはパイプ | で区切るか、配列で指定できます。
主要なバリデーションルール
メールアドレスの詳細な検証
email ルールには、検証方法を指定するパラメータを追加できます。
rfc は RFC に従った形式を、dns はメールアドレスのドメインに有効な MX レコードがあることを検証します。dns は実際に DNS lookup を実行しますが、個別のメールボックスが存在するかどうかは判定しません。
fluent な Rule builder を使って同じ検証を記述することもできます。
Validator::fakeDnsLookups を使います。これにより dns lookup を fake しつつ、rfc など他の検証は通常どおり実行できます。
配列のキーを検証する
array_keys ルールは、対象の値がPHPの配列であり、すべてのキーが指定した一覧に含まれていることを検証します。少なくとも1つのキーを指定してください。
Rule::arrayKeys メソッドで指定できます。
利用可能なすべてのバリデーションルールは公式ドキュメントで確認できます。
バリデーション済みデータの利用
validate メソッドの戻り値は、バリデーションに通ったデータのみを含む配列です。
信頼できるデータとして安全に使えます。
Bladeテンプレートでのエラー表示
バリデーションに失敗すると、Laravelは$errors 変数をすべてのビューで自動的に利用できるようにします。
web ミドルウェアグループに含まれる ShareErrorsFromSession ミドルウェアがこれを担っています。
すべてのエラーを一覧表示する
フィールドごとにエラーを表示する
@error ディレクティブを使うと、特定のフィールドのエラーをインラインで表示できます。
フォームリクエスト
フォームリクエストとは
バリデーションロジックが複雑になってきた場合は、「フォームリクエスト」クラスに切り出すのが効果的です。 フォームリクエストはバリデーションと認可のロジックをひとつのクラスにまとめたカスタムリクエストクラスです。フォームリクエストの作成
make:request Artisanコマンドでフォームリクエストクラスを生成します。
app/Http/Requests/StorePostRequest.php が生成されます。
rules() メソッド
バリデーションルールを配列で返します。コントローラーの validate メソッドに渡す配列と同じ形式です。
authorize() メソッド
このリクエストを実行する権限があるかを判定します。
true を返すと認可OK、false を返すと403レスポンスが自動的に返されます。
認証済みユーザーのみ許可する場合、auth()->check() で確認できます。
チュートリアルでは true を返しておけば問題ありません。
コントローラーへの注入
フォームリクエストはコントローラーメソッドのタイプヒントとして指定するだけで使えます。 コントローラーが呼び出される前にバリデーションが実行されるため、メソッド内にバリデーションコードを書く必要はありません。$request->validated() でバリデーション済みのデータのみを取得できます。
パスワードの複雑性と長さを指定する
Password ルールオブジェクトを使うと、パスワードの複雑性と最小・最大文字数をまとめて指定できます。
min() は最小文字数、max() は最大文字数を指定します。max() を指定すると、複雑なパスワードを許可しながら、保存や外部サービス連携で想定する上限も明示できます。
実践例:投稿フォームの作成と保存
フォームの表示から送信・バリデーション・保存までの一連のフローです。1
ルートの定義
2
フォームリクエストの作成
3
コントローラーの実装
4
Bladeテンプレートの作成
Bladeフォームには必ず
@csrf ディレクティブを含めてください。CSRFトークンがないとLaravelは419エラーを返します。次のステップ
HTTPリクエスト
リクエストオブジェクトを使ったデータ取得方法を振り返ります。