Laravel

Laravelのformのバリデーションとエラー表示

バリデーションの設定


バリデーションはコントローラーでも行えますが、Fatコントローラーになりがちなので基本はRequestクラスを作成するのがおすすめです。
詳しく書くとそれだけで1記事出来上がってしまうのでひとまずここでは割愛します。詳しくは下記参考ドキュメントを御覧ください。

参考:
公式 https://laravel.com/docs/8.x/validation#form-request-validation
日本語 https://readouble.com/laravel/8.x/ja/validation.html > フォームリクエストバリデーション

エラーメッセージの表示

バリデーションが設定されていれば、エラー時に$errorsパラメータが渡されます。
これを表示するために、bladeテンプレートに追記します。

error_message.blade.php

最小限

@foreach ($errors->all() as $error)
    {{ $error }}
@endforeach

例として、bootstap5を使って✕ボタンのついたalertにするなら下記のようになります。
ref: https://getbootstrap.jp/docs/5.0/components/alerts/#dismissing

        <div class="alert alert-danger alert-dismissible fade show" role="alert" style="width: 100%;">
            @foreach(array_unique($errors->all()) as $error)
                <div>{{ $error }}</div>
            @endforeach
            <button type="button" class="btn-close" data-bs-dismiss="alert" aria-label="Close"></button>
        </div>

直接書いてもいいですが、上記だけでテンプレートに分離しておいて

@include('modules.messages.errors')

というような形式で呼べるようにしておくと使いまわしがききます。
()内のパスは適宜調整してください。

入力値の保持

上記の設定でどこの入力に問題があったか、エラーの表示はされるようになったかと思います。
しかしながら、これだけでは入力した値がすべてクリアされてしまいます。もう一度入力し直し...面倒だしまたミスする可能性があります。
それを避けるために入力値の保持を行います。

Laravelではフォームの入力値をセッションで保持するようになっており、old()という関数で呼び出すことができます。()内に該当するパラメータのnameを入れます。
ref: https://laravel.com/docs/8.x/validation#repopulating-forms

これをvalueの初期値として設定することで、入力値の保持ができます。
bladeテンプレートのinput部分に下記のように記載して使います。

<input type="text" name="name"  value="{{ old('name') }}">

<textarea name="textarea">{{ old('textarea') }}</textarea>

<select name="select">
  <option value="" @if(!old('select')) selected @endif></option>
  <option value="value1" @if(old('select')=='value1') selected @endif>値1</option>
  <option value="value2" @if(old('select')=='value2') selected @endif>値2</option>
</select>

以上で、入力値のバリデーションと保持が完了です。

-Laravel