在Laravel中验证日期(4.2)

时间:2015-04-11 20:25:07

标签: php laravel

我在Laravel(4.2)

中验证日期时遇到了问题
$input = array('date_field' => '23/12/2');
$validation_rules = array('date_field'  => 'required|date_format:d/m/y');
$validation = Validator::make($input, $validation_rules);
echo ($validation->fails()) ? 'fail' : 'pass';

如果样本(虽然不正确)日期通过23/12/2,验证器仍然会返回一个传递,技术上应该是失败。

我基本上试图强制输入字段格式,使其与dd / mm / yy UK日期格式匹配。

谢谢!

2 个答案:

答案 0 :(得分:1)

您可以使用regex:来确保date_format之外的格式,例如:

$validation_rules = [
    'date_field' => [
        'required',
        'date_format:m/d/y',
        'regex:#[0-9]{2}\/[0-9]{2}\/[0-9]{2}#'
    ]
];

但是'23/12/2'无效并且应该是失败但却混淆了为什么它通过了!

答案 1 :(得分:0)

您可以在日期中使用规则。您可以指定用户可以输入的最短日期。这样,如果用户在最短日期之后输入日期,则将传递验证结果。

实施例

$input = array('date_field' => '23/12/2');
$minDate = '01/01/67';
$validation_rules = array('date_field'  => 'required|date_format:d/m/y|after:' . $minDate);
$validation = Validator::make($input, $validation_rules);
echo ($validation->fails()) ? 'fail' : 'pass';

另一种解决方案是,您必须编写自定义验证,以检查日期或月份用户输入的内容是否超过某些内容。

验证月份的自定义验证示例

Validator::extend('maxMonth', function($field,$value,$parameters){

    $value = explode("/", $value);
    if($value[1] < 13) {
        $value[1] = true;
    }
    else {
        $value[1] = false;
    }
    return $value[1];
});

Route::get('/date', function()
{

    $input = array('date_field' => '33/12/68');

    $validation_rules = array('date_field'  => 'required|date_format:d/m/y|maxMonth');

    $messages = array(
        'maxMonth'=>'Please enter month between 01-12'
    );

    $validation = Validator::make($input, $validation_rules, $messages);

    if($validation->passes()){
        // Do something if passes
    }else{
        // Do something if fails
    }
});