はじめに
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',
]);
成功しました




