Laravel有条件地添加规则,如果其他验证规则无效,则停止一条规则

时间:2015-04-23 07:53:50

标签: php laravel

如果laravel

中的其他规则未成功,如何停止一个验证规则

我有一个日期输入类型,我有3个验证规则:

  1. date
  2. date_format:m/d/Y
  3. after:date('m/d/Y)
  4. 当我输入04/05/2014dsada之类的无效数据时,日期后规则仍在运行。如何停止运行验证后规则?

    如何在Laravel中完成这个?

    这是我的示例代码:

    $rules = array('mmad_starting_date' => 'date|required|date_format:m/d/Y|after:'.date("m/d/Y H:i"));
    

    如果我将使用laravel Conditional Add Rules。

    $validator->sometimes('mmad_starting_date', 'after:'.date(m/d/Y), function($input){
           //how can i check if the mad_starting_date is a valid date
         return $input->mmad_starting_date = (what should i input here);
    });
    

4 个答案:

答案 0 :(得分:1)

如果前一个属性已经失败,您可以避免传递给属性的下一个规则。

只需扩展Illuminate \ Validation \ Validator类并覆盖pass方法。

在MessageBag中遇到该属性的错误时,请立即中断循环。

public function passes()
{
    $this->messages = new MessageBag;

    // We'll spin through each rule, validating the attributes attached to that
    // rule. Any error messages will be added to the containers with each of
    // the other error messages, returning true if we don't have messages.
    foreach ($this->rules as $attribute => $rules)
    {
        foreach ($rules as $rule)
        {
            $this->validate($attribute, $rule);
            /* If the error MessageBag has error for the $attribute, break */
            if($this->messages->has($attribute))
                break;
        }
    }

    // Here we will spin through all of the "after" hooks on this validator and
    // fire them off. This gives the callbacks a chance to perform all kinds
    // of other validation that needs to get wrapped up in this operation.
    foreach ($this->after as $after)
    {
        call_user_func($after);
    }

    return count($this->messages->all()) === 0;
}

答案 1 :(得分:1)

在Laravel 5.2中,您可以通过添加bail规则轻松完成此操作。如果将bail规则添加到属性,则如果一个规则失败,验证将不会检查其他规则。

在您的情况下,您可以简单地使用,

$rules = array('mmad_starting_date' => 'bail|required|date_format:m/d/Y|after:'.date("m/d/Y H:i"));

参考Laravel验证文档here

答案 2 :(得分:0)

你可以试试这个:(基本上是date_format规则的内容......)

$validator->sometimes('mmad_starting_date', 'after:'.date(m/d/Y), function($input){
     $parsed = date_parse_from_format('m/d/Y', $input->mmad_starting_date);
     return $parsed['error_count'] === 0 && $parsed['warning_count'] === 0;
 });

答案 3 :(得分:0)

Thnx lukasgeiter你的解决方案有效,

我所做的还是在我的corevalidator类中创建一个自定义验证器并创建两个函数并且它可以工作。

 public function validateAfterDatetoday($attribute, $value, $parameters){

    $today = new DateTime(date("m/d/Y H:i"));

    if($this->validateThisDate($value)){
        $date = new DateTime($value);

        if($today > $date){
            return false;
        }

    }

    return true;
}
 function validateThisDate($date){

    $d = DateTime::createFromFormat('m/d/Y', $date);

    if($d){

        return true;
    }

    return false;
}

并在我的mmad_starting_date字段中使用它。无论如何,你的解决方案更好。