Laravelのカスタムバリデーションで日付の妥当性チェック
はじめに
Laravelの日付入力で入力画面が年/月/日に分割されているときに、標準Validatorに渡すためには入力値を調整する必要があって、
$inputs = $request->all(); $inputs['birthday'] = $inputs['birth_year'] . '/' .$inputs['birth_month'] . '/' .$inputs['birth_day']; Validator::make($inputs, ...みたいに書いてみたんだけど、他の画面では
$request->validate([...って書いているプロジェクトだったので、統一したほうがいいよなーと思ったのと、そもそも入力値の配列を操作したくなかったので、カスタムバリデータで対応しました。
実装
まずカスタムバリデータを登録する場所を決める必要があります。
今回はどこかの例で見たServiceProviderに登録することにしました。
コマンドを実行
今回はどこかの例で見たServiceProviderに登録することにしました。
コマンドを実行
php artisan make:provider ValidatorServiceProviderサービスプロバイダーに登録(config/app.php)
providers' => [ // 略 App\Providers\ValidatorServiceProvider::class, ],
バリデーションを実装します(src/app/Providers/ValidatorServiceProvider.php)
class ValidatorServiceProvider extends ServiceProvider { /** * Bootstrap services. * * @return void */ public function boot() { Validator::extend('valid_date', function ($attribute, $value, $parameters, $validator) { if (!isset($parameters)) { return false; } if (!is_array($parameters)) { return false; } $data = $validator->getData(); $year = $data[$parameters[0]]; $month = $data[$parameters[1]]; $day = $data[$parameters[2]]; if (!is_numeric($year) || !is_numeric($month) || !is_numeric($day)) { return false; } return checkdate($month, $day, $year); }); } // 略
呼び出し
$request->validate([ 'birth_year' => 'required|numeric|valid_date:birth_year,birth_month,birth_day', 'birth_month' => 'required|numeric', 'birth_day' => 'required|numeric', ]);成功しました