Laravel8 Requestクラスでバリデーション(配列編)

laravel

記事について

配列形式のフォーム値をlaravel8のRequestクラスでバリデーションするメモ。あくまでサンプルで通しで動作確認はしていないので、エラーが出たらごめんなさい。

フォーム内容

以下のようなメールアドレスを配列形式で入力させるフォームがあるとする。サンプルなのでデザインはなし。email[0]~email[5]を定義している形。

{{ Form::open(['route' => ['user.create'], 'class' => '']) }}
    @for($i=0;$i<5;$i++)
        <input class="" name="email[]" maxlength="200" value="{{ old('email.'.$i, null) }}" type="email" placeholder=""><br>
        @error('email.'.$i)
            {{ $message }}
        @enderror
    @endfor
    <button class="" type="submit">登録する</button>
{{ Form::close() }}

Requestクラスの内容

この配列項目、項目名「email」をバリデーションしたい場合のRequestクラスは以下。namespaceやmodel名は仮。

<?php
namespace App\Http\Requests\User;

use Illuminate\Foundation\Http\FormRequest;
use App\Models\User;

class CreateUserRequest extends FormRequest
{
    public function authorize()
    {
        return true;
    }

    public function rules()
    {
        return[
            'email.*' => ['required', 'email',
                /*
                 * DBを特定条件でチェックする
                 * この例はUserテーブルから同一メールアドレスかつフラグが有効なレコードを検索
                 * 同一条件のレコードがある場合はエラーとしている
                 */
                'used' => function ($attribute, $value, $fail) {
                    if (User::where('email', $value)->where('enable', 1)->exists()) {
                        $fail('このメールアドレスは使用されています。');
                    }
                },
                /*
                 * フォーム内の重複をチェックする
                 * email内いずれかの値が重複している場合はエラーとしている
                 */
                'duplicate' => function ($attribute, $value, $fail) {
                    if ($value) {
                        $countValues = @array_count_values($this->email);
                        if ($countValues[$value] > 1) {
                            $fail('入力したメールアドレスがフォーム内で重複しています');
                        }
                    }
                }
            ],
        ];
    }

    public function messages()
    {
        return [
            'email.*.required' => '入力必須です。',
            'email.*.email' => '形式が正しくありません。'
        ];
    }

    public function attributes()
    {
        return [
            'email.*' => 'メールアドレス',
        ];
    }
}

余談

細かいところの書き方ってすぐ忘れるね・・・

コメント

タイトルとURLをコピーしました