具有其他条件的验证规则required_if(Laravel 5.4)

kes*_*sm0 6 php validation validationrules laravel laravel-5.4

我对带有嵌套条件的验证规则有疑问。

class StoreRequest extends Request
{
        public function authorize(){
        return true;
        }

        public function rules(){
                return [
                    'type_id'     => 'required|integer',
                    'external_id' => 'required_if:type_id,==,3|integer',
                ];
        }
}
Run Code Online (Sandbox Code Playgroud)

实际上,我想:-仅在type_id等于3时检查external_id-并检查它是否为整数。

发布表单时,当我选择等于3的type_id时,规则将起作用。但是,如果我选择另一个type_id(如1或2),则验证不会通过:

external_id必须为整数。

我尝试添加可为空的条件,但required_if不再起作用

你有什么主意吗?

Nic*_*k A 7

刚遇到相同的问题,发现以下答案似乎对我有用:

如果需要验证规则,请使用表单生成器

     return [
                'type_id'     => 'required|integer',
                'external_id' => 'required_if:type_id,==,3|nullable|integer',
            ];
Run Code Online (Sandbox Code Playgroud)

对我的结果:

字段未填充,输入的ID不是3-通过

字段未填充,输入ID 3-失败-必填字段

填充的字段,类型ID 3,非整数-整数规则失败

填充字段,输入ID 3,整数-通过-一切都很好!

注意-Laravel 5.3中引入了可为空的规则


Gra*_*ham 6

您的规则执行两项相互独立的检查;仅因为external_idtype_id!= 3 时不需要该字段,并不意味着忽略整数检查。

您正在寻找的是条件规则,它使您可以更好地控制何时执行检查,例如:

$validator = Validator::make($data, [
    'type_id'   => 'required|integer'
]);

$validator->sometimes('external_id', 'required|integer', function($input) {
    return $input->type_id == 3;
});
Run Code Online (Sandbox Code Playgroud)

使用表单验证时,可以通过重写getValidatorInstance()方法访问基础验证器实例:

class StoreRequest extends Request
{
        public function authorize(){
        return true;
        }

        public function rules(){
                return [
                    'type_id'     => 'required|integer'
                ];
        }

        protected function getValidatorInstance() {
            $validator = parent::getValidatorInstance();
            $validator->sometimes('external_id', 'required|integer', function($input) {
                return $input->type_id == 3;
            });
            return $validator;
        }
}
Run Code Online (Sandbox Code Playgroud)