概要
Laravelにおけるフォーム入力のバリデーションのうち、validate()
メソッドによる手順を整理する。
検証ルールの詳細については別途整理している。
コード例
ビュー
以下のビューで入力と入力結果の表示を兼用。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
<h1>{{ $title }}</h1> <form action="{{ url('/validation_sample ')}}" method="post"> @csrf <p><input type="text" name="name" placeholder="ユーザー名"></p> <p><input type="text" name="handlename" placeholder="ハンドルネーム"></p> <p><input type="text" name="email" placeholder="メールアドレス"></p> <input type="submit" value="送信"> </form> <hr> @if (isset($user)) <p>ユーザーネーム:{{ $user['name'] }}</p> <p>ハンドルネーム:{{ $user['handlename'] }}</p> <p>メールアドレス:{{ $user['email'] }}</p> @endif |
コントローラー
GETに対するアクションは、単にビューを表示するだけ。
1 2 3 4 5 |
public function showValidationForm(Request $request) { return view('samples.validation_form', [ 'title' => 'バリデーションサンプル入力', ]); } |
フォームからのPOSTに対するアクションは、ユーザー名、ハンドルネーム、メールアドレスの3つの入力を受け取り、下部にそれを表示する。タイトル表示で入力結果を表示していることが判別できる。
1 2 3 4 5 6 7 8 9 10 11 12 |
public function showValidation(Request $request) { $user = [ 'name' => $request->input('name'), 'handlename' => $request->input('handlename'), 'email' => $request->input('email'), ]; return view('samples.validation_form', [ 'title' => 'バリデーションサンプル結果', 'user' => $user, ]); } |
条件の設定
基本形
検証条件設定の基本形は以下のとおり。検証条件の詳細はこちらを参照。
- アクションの引数の
Request
インスタンスのvalidate()
メソッドで設定 - 条件は連想配列で
validate()
の引数に渡す - 連想配列のキー文字列がフォームの各アイテムの
name
属性値 - キーに対応する値が各アイテムに対する条件で、文字列で設定
$request->validate(['name属性' => '検証条件']);
複数条件
1つのアイテムに複数の条件があるときの設定方法には2つある。
配列にする方法
検証条件の文字列を要素とする配列を値とする。
$request->validate(['name属性' => ['検証条件1', '検証条件2', ...]]);
文字列内で'|'
でつなぐ方法
検証条件をOR演算子と同じ'|'
でつないだ文字列を値として渡す。
$request->validate(['name属性' => '検証条件1|検証条件2|...']);
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
public function showValidation(Request $request) { $request->validate([ 'name' => 'required', 'handlename' => ['required', 'max:10'], 'email' => ['required', 'regex:/^\w+@\w+$/'] ]); $user = [ 'name' => $request->input('name'), 'handlename' => $request->input('handlename'), 'email' => $request->input('email'), ]; return view('samples.validation_form', [ 'title' => 'バリデーションサンプル結果', 'user' => $user, ]); } |
検証結果に応じた処理
処理の流れ
検証結果が妥当な場合は、そのまま以降の処理が実行される。検証結果の1つ以上が妥当でなければ、validate()
メソッドより後は実行されず、元の画面がレンダリングされる。
先のコードで、すべての条件が妥当なら、タイトルが「バリデーションサンプル結果」となり入力内容が表示される。一方、条件の何れか1つでも妥当でなければ、タイトルは「バリデーションサンプル入力」となり入力内容は表示されない。
$errors
バリデーションの結果が妥当でない場合、グローバル変数$errors
にメッセージが保存される。$errors
はViewErrorBag
クラスのオブジェクトで、以下の様にすることで各エラーメッセージを順次取り出すことができる(エラーがない場合は処理されない)。
foreach ($errors->all() as $error)
以下は$errors
の内容をビューに表示させる例。コントローラーで特に定義等の必要はなく、検証結果に応じてセットされる。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
<h1>{{ $title }}</h1> <form action="{{ url('/validation_sample ')}}" method="post"> @csrf <p><input type="text" name="name" placeholder="ユーザー名"></p> <p><input type="text" name="handlename" placeholder="ハンドルネーム"></p> <p><input type="text" name="email" placeholder="メールアドレス"></p> <input type="submit" value="送信"> </form> <hr> @if (isset($user)) <p>ユーザーネーム:{{ $user['name'] }}</p> <p>ハンドルネーム:{{ $user['handlename'] }}</p> <p>メールアドレス:{{ $user['email'] }}</p> @endif @foreach ($errors->all() as $error) <p>{{ $error }}</p> @endforeach |
たとえばユーザーネームを空にし、ハンドルネームに11文字、メールアドレスに@
マークなしの文字列を入れた場合の$errors
の表示例は以下のとおり。
The name field is required.
The handlename may not be greater than 10 characters. The email format is invalid. |
フォームリクエスト
ここではコントローラーにバリデーション処理を記述したが、フォームリクエストを利用することによってこれを分離できる。
また、フォームリクエストのメソッドをオーバーライドして、エラーメッセージをカスタマイズすることもできる。
参考:Laravel 6.x バリデーション~エラーメッセージのカスタマイズ