如果laravel
中的其他规则未成功,如何停止一个验证规则我有一个日期输入类型,我有3个验证规则:
date
date_format:m/d/Y
after:date('m/d/Y)
。当我输入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);
});
答案 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字段中使用它。无论如何,你的解决方案更好。