[PHP][Laravel][バリデーション] 開始と終了の日付バリデーション処理

概要

開始日と終了日のテキストボックスがある。
それぞれ必須入力ではなく、指定可能期間は本日〜1ヶ月後とする。
開始日が指定された場合のみ、「開始日 <= 終了日」の条件が発生。

コード

public function rules()
{
    $today = date("Y-m-d");
    $nextmonth = date("Y-m-d", strtotime("1 month"));

    return [
        'date_start_at' => 'nullable|date|after_or_equal:' . $today . '|before:' . $nextmonth,
        'date_end_at'   => 'nullable|date|after_or_equal:' . $today . '|before:' . $nextmonth,
    ];
}

「after_or_equal:today」等にするとエラーメッセージが分かり難くなるので具体的な日付を指定している。

「開始日 <= 終了日」の条件をsometimesメソッドで行う。

public function withValidator(Validator $validator)
{
    $validator->sometimes('date_end_at', 'after_or_equal:date_start_at', function ($input) {
        return !is_null($input->date_start_at);
    });
}

date_start_atが指定された場合のみsometimesの第一引数(date_end_at)を対象に第二引数の条件をバリデーションする。



PHPフレームワーク Laravel入門

PHPフレームワーク Laravel入門