我有一个用户注册表格,它将输入出生日分为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',
]);
}
但肯定不会检查是否提供了无效日期。如果用户提供了31st February, 1982
之类的无效日期,则Carbon::create()
会将日期转换为3rd March, 1982
,结果证明该日期是有效日期。
如果我想过滤此类日期输入,我需要做什么?我相信对于那些不使用某种日期选择器的人来说,这可能是一个非常普遍的要求。
答案 0 :(得分:1)
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']
的值应为特定格式的string
。
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',
]);
}
此外,您可以忽略day
和month
的验证,因为日期将得到验证。