0
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

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

Last updated at Posted at 2021-09-01

やりたいこと

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

image.png

  • 以下のように、単純にバリデーションすると 日付として成立しているかの検証ができない。
  • 年、月、日 を 合わせて、日付として成立しているか評価したい!
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() ありそうです。
0
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?