我有一个用户注册表单,它将输入的生日分为 3 个不同的输入字段,即日、月、年
{!! Form::selectMonth('month', null) !!}
{!! Form::selectRange('day', 1, 31, null) !!}
{!! Form::selectYear('year', Carbon\Carbon::now()->year, (new Carbon\Carbon('100 years ago'))->year, null) !!}
在后端,我修改了 Registrar.php/validator()
以检查输入日期是否有效:
public function validator(array $data) {
$data['date_of_birth'] = Carbon::create($data['year'], $data['month'], $data['day'], 0, 0, 0)->toDateString();
$current_year = Carbon::now()->year;
$hundred_years_ago = (new Carbon("100 years ago"))->year;
return Validator::make($data, [
'year' => 'Required|Integer|Between:'.$hundred_years_ago.','.$current_year,
'month' => 'Required|Integer|Between:1,12',
'day' => 'Required|Integer|Between:1,31',
'date_of_birth' => 'Required|Date',
]);
}
但它肯定不会检查是否提供了无效日期。如果用户提供了无效日期,例如 1982 年 2 月 31 日
,Carbon::create()
会将日期转换为 1982 年 3 月 3 日
事实证明这是一个有效的。
如果我想过滤这种类型的日期输入,我需要做什么?我确实相信,对于那些不使用某种日期选择器的人来说,这可能是一个非常常见的要求。
最佳答案
Laravel 使用 strtotime
和 checkdate
函数 validate a date .
Laravel 的 validateDate
函数如何工作?一个例子:
strtotime('30-2-2015'); // returns a timestamp
checkdate(2, 30, 2015); // returns false
// laravel raises an error
因此,$data['date_of_birth']
的值应该是特定格式的字符串
。
public function validator(array $data)
{
$data['date_of_birth'] = $data['day'].'-'.$data['month'].'-'.$data['year'];
$current_year = Carbon::now()->year;
$hundred_years_ago = (new Carbon("100 years ago"))->year;
return Validator::make($data, [
'year' => 'Required|Integer|Between:'.$hundred_years_ago.','.$current_year,
'date_of_birth' => 'Required|Date',
]);
}
您还可以忽略日
和月
的验证,因为日期将被验证。
关于php - 如何在 Laravel 5 中根据单独的日、月、年输入验证输入日期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30866079/