验证规则 required_if 和其他条件 (Laravel 5.4)

问题描述 投票:0回答:5

我遇到了带有嵌套条件的验证规则的问题。

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',
                ];
        }
}

我确实想: - 仅当 type_id 等于 3 时才检查 external_id - 并检查它是否是整数。

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

external_id 必须是整数。

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

你有什么想法吗?

php laravel validation laravel-5.4 validationrules
5个回答
35
投票

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

使用表单生成器中的验证规则时使用必需的问题

     return [
                'type_id'     => 'required|integer',
                'external_id' => 'required_if:type_id,==,3|nullable|integer',
            ];

我的结果:

字段未填充,类型 ID 不是 3 - 通过

字段未填充,类型 id 3 - 失败 - 必填字段

已填充字段,类型 id 3,非整数 - 不符合整数规则

字段已填充,类型 id 3,整数 - 通过 - 一切都很好!

注意 - 认为可空规则出现在 Laravel 5.3


14
投票

您的规则执行两项相互独立的检查;只是因为当

external_id
!= 3 时不需要
type_id
字段,并不意味着忽略整数检查。

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

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

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

使用表单验证时,您可以通过重写

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;
        }
}

0
投票

试试这个 直接传值 参考:https://www.npmjs.com/package/validatorjs

“required_if:另一个字段,值”

如果另一个字段字段等于任何值,则验证中的字段必须存在且不为空。

'type_id'     => 'required|integer',
'external_id' => 'required_if:type_i,3|integer',

0
投票

我认为最简单的方法是

'type_id'     => 'required|integer',
'external_id' => $this->type_id === 3 ? 'required|integer' : 'nullable',

-1
投票

试试这个,

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

            public function rules(){
                    return [
                        'type_id'     => 'required|integer',
                        'external_id' => 'required_if:type_id|in:3|integer',
                    ];
            }
    }
© www.soinside.com 2019 - 2024. All rights reserved.