Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何从Laravel 5中的单个日、月、年输入验证输入日期_Php_Date_Laravel 5 - Fatal编程技术网

Php 如何从Laravel 5中的单个日、月、年输入验证输入日期

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) !!} 在后端,我修改

我有一个用户登记表,它将输入的出生日期分为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) !!}
在后端,我修改了
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日,他们只是在和你捣乱。因此,您需要针对特定类型的输入引发验证错误(从用户角度来看,这更符合逻辑)。