如何在Laravel 5中验证来自单个日,月,年输入的输入日期

时间:2015-06-16 11:18:02

标签: 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) !!}

在后端我修改了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,结果证明该日期是有效日期。

如果我想过滤此类日期输入,我需要做什么?我相信对于那些不使用某种日期选择器的人来说,这可能是一个非常普遍的要求。

1 个答案:

答案 0 :(得分:1)

Laravel使用strtotimecheckdate函数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',
    ]);
}

此外,您可以忽略daymonth的验证,因为日期将得到验证。