リクエストデータをバリデーション(登録フォームを作る②)
以前の記事で作ったフォームを使って、バリデーション(入力値の検証)を実装してみましょう。
storeメソッドにバリデーション処理を書いてみます。
// 保存処理
public function store(Request $request) {
// バリデーション
$request->validate([
'name' => 'required|string|max:10',
'age' => 'required|integer|min:20|max:60'
]);
dump($request->all());
}Requestインスタンスのvalidate()メソッドでバリデーションを行います。
引数は連想配列で、要素名には各入力項目の名前(inputのname属性)、値にはバリデーションルールを|(パイプ)でつないだ文字列を指定します。
|(パイプ)でつないだ各ルールは、左から順に検証されていきます。
ここで使われているバリデーションルールは、次のような意味です。
- required … 必須入力である
- string … 文字列である
- integer … 整数である
- min:数値 … 値が数値以上である
- max:数値 … 値が数値以下である
バリデーションルールに当てはまらない項目があった場合、自動的に以前のページ(入力画面)に戻されます。
戻された入力画面ではエラーメッセージを表示したいですね。
入力画面のbladeにエラーメッセージの表示処理を追加します。
<html>
<body>
@if ($errors->any())
<ul>
@foreach ($errors->all() as $error)
<li>{{ $error }}</li>
@endforeach
</ul>
@endif
<form method="POST" action="/members">
@csrf
<p>
name<br>
<input type="text" name="name">
</p>
<p>
age<br>
<input type="text" name="age">
</p>
<p>
<input type="submit" value="send">
</p>
</form>
</body>
</html>
$errors変数は、エラーメッセージを格納しているインスタンスです。
この変数はコントローラから引き渡さなくてもbladeでいつでも使うことができます。
$errors->any()メソッドは、エラーが1つでもあればtrueを返します。
$errors->all()メソッドはすべてのエラーメッセージを配列で返します。
入力画面に戻った時、各項目の入力内容が消えてしまうと不便です。
inputタグを以下のようにすることで、入力内容を維持することができます。
<input type="text" name="name" value="{{ old('name') }}">
<input type="text" name="age" value="{{ old('age') }}">oldヘルパ関数は、引数で指定した入力項目の、直前の値を取得します。
