【Laravel】入力フォームの値の複合バリデーション


やりたいこと

  • Laravel で 生年月日が 年、月、日でバラバラにPOSTされるケース。

  • 以下のように、単純にバリデーションすると 日付として成立しているかの検証ができない。
  • 年、月、日 を 合わせて、日付として成立しているか評価したい!
example
// リクエスト例
request()->birthday_year;
request()->birthday_month;
request()->birthday_day;

// それぞれバリデーションする場合
'birthday_year' => 'required|integer|date_format:Y',
'birthday_month' => 'required|between:1,12',
'birthday_day' => 'required|between:1,31',

方法

  • withValidator() を使うと、通常のバリデーションルールを通過したあとに、柔軟にルール追加ができた。
  • $this->input('birthday_xxx') のように項目ごとに入力内容が取得できるので、checkdate() で 日付として成立しているか評価する。
  • $validator->errors()->add($key, $message) で、 特定のキーに対して、エラーメッセージを追加することが可能
BirthdayRequest.php
<?php

namespace App\Http\Requests;

use App\Http\Requests\Request;

class BirthdayRequest extends Request
{
    protected $rules = [
        'birthday_year' => 'required|integer|date_format:Y',
        'birthday_month' => 'required|between:1,12',
        'birthday_day' => 'required|between:1,31',
    ];

    protected function withValidator($validator): void
    {
        $validator->after(function ($validator) {
            if (!checkdate($this->input('birthday_month'), $this->input('birthday_day'), $this->input('birthday_year'))) {
                $validator->errors()->add('birthday_day', '正しい日付を入力してください');
            }
        });
    }
}

あとがき

  • 詳しくは...
  • withValidator() 使わなくても、デフォルトのバリデーションルールだけで、できると嬉しいな。(パット見なさそう?)
  • Laravel5.5 あたりから、 withValidator() ありそうです。