やりたいこと
- 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', '正しい日付を入力してください');
}
});
}
}
あとがき
- 詳しくは...
- https://readouble.com/laravel/8.x/ja/validation.html
- フォームリクエストへのAfterフックを追加
-
withValidator()
使わなくても、デフォルトのバリデーションルールだけで、できると嬉しいな。(パット見なさそう?) - Laravel5.5 あたりから、
withValidator()
ありそうです。