リクエストデータをバリデーション(登録フォームを作る②)

以前の記事で作ったフォームを使って、バリデーション(入力値の検証)を実装してみましょう。
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ヘルパ関数は、引数で指定した入力項目の、直前の値を取得します。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です