如何在阵列上应用自定义验证?

时间:2017-06-16 18:34:11

标签: php laravel validation laravel-5

我的问题相当复杂,很难用文字解释,所以我会尽我所能。

我有三个输入,都是数组,' A' ' B' ' C&#39 ;.我还有一个复选框输入' D' (不是数组)。如果B或C中的相应元素非空,则必须要求A中的每个元素,但是,如果D的值为1,即使B或C中的相应元素不是,也不应该要求A -empty。如果A [1]为空,且B [1]为空但C [1]为非空,我希望只需要A [1],而不是A [0]或A [2]。

我创建了一些试图解决这个问题的规则,但我不确定如何解决它。

$validator = Validator::make($output, [
]);

$validator->sometimes('A.*', 'required', function($input){
    if ($input->D==1){//if checkbox D is checked, don't make A required regardless of anything else
        return false;
    }
    if (($input->B!=null) || ($input->C!=null)){//Problem: instead of doing it for the individual elements 
    //it will make A required if any element of B or C is non-empty
        return true;
    }
    return false;
});

1 个答案:

答案 0 :(得分:0)

定义您需要编写custom.validation规则。使用内置验证规则,您无法满足如此复杂的要求。如果要求只需要A元素,如果B,C中的元素存在,并且复选框D不是1,则可以使用requireWithAll规则。

if(!$request->has('D') || $request->input('D') != 1){
        $rules = [
            'A.*' => 'required_with_all:B.*,C.*'
        ];

        $messages = [
            'A.*.*.required_with_all' => 'All A Elements are required if corresponding B and C elements present',

        ];

        $validator = Validator::make($request->all(),$rules,$messages);
        if($validator->fails()){
            $this->throwValidationException($request,$validator);
        }
    }

只需将上面的代码粘贴到您要进行验证的位置,这是满足您的要求而不是编写复杂的自定义规则的简单方法,但请注意,所有数组索引必须在A,B,C之间相似。