Php 如何从Laravel 5中的单个日、月、年输入验证输入日期
我有一个用户登记表,它将输入的出生日期分为3个不同的输入字段,即天、月、年Php 如何从Laravel 5中的单个日、月、年输入验证输入日期,php,date,laravel-5,Php,Date,Laravel 5,我有一个用户登记表,它将输入的出生日期分为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) !!} 在后端,我修改
{!! 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) !!}
在后端,我修改了register.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使用
strotime
和checkdate
函数
Laravel的validateDate
功能是如何工作的?例如:
strtotime('30-2-2015'); // returns a timestamp
checkdate(2, 30, 2015); // returns false
// laravel raises an error
因此,$data['date\u 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',
]);
}
此外,您还可以忽略对日期
和月份
的验证,因为日期将被验证。函数?我知道checkdate()
函数的用法。但我不太明白如何将它与laravel验证器一起使用。我应该编写一个自定义的验证器来扩展默认的验证器并创建一个服务提供者,还是其他更优雅的方式呢?不太可能。这与格式无关。它是关于过滤无效日期的。Php strotime还将1982年2月31日转换为1982年3月3日(试试这个:日期(“jS F,Y”,strotime(“31-2-1982”);
)。因此,在您的代码中,1982年2月31日不会引发验证错误。关键是,如果用户输入2月31日,他们只是在和你捣乱。因此,您需要针对特定类型的输入引发验证错误(从用户角度来看,这更符合逻辑)。