将自定义条件验证规则添加到同一属性

时间:2017-05-22 12:52:23

标签: php laravel validation laravel-5 laravel-5.4

我正在尝试为我的管理面板添加文件上传的自定义验证逻辑。现在,如果文件没有上传或更改,我的文件字段可以返回Illuminate\Http\UploadedFilestring|null。我正在做的是,我创建了一个如下所示的自定义规则:

'image' => [
    'required',
    'admin_file:mimes:jpeg;png,dimensions:min_width=800;min_height=600'
]

然后我解析了我传递的所有参数,事情是,我自然希望只有当我的值是UploadedFile的实例时才应用它们。我使用以下代码进行自定义验证:

<?php

class AdminFileValidator
{
    public function validate($attribute, $value, $parameters, Validator $validator)
    {
        $rules = implode(
            "|",
            array_map(function($item) {
                return str_replace(";", ",", $item);
            }, $parameters)
        );

        $validator->sometimes($attribute, $rules, function() use ($value) {
            return $value instanceof UploadedFile;
        });

        return true;
    }
}

问题在于通过sometimes向属性添加其他规则不起作用。添加的规则未由验证程序处理。

有没有办法验证这些规则没有手动重新验证整个事情?

1 个答案:

答案 0 :(得分:0)

我看到的是你在规则中使用sometimes。从我的角度来看,你需要把它拿出来,甚至更好,而不使用自定义类。

使用Validator对象:

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

$validator->sometimes('image', 'mimes:jpeg;png,dimensions:min_width=800', function($value) {
    return $value instanceof UploadedFile;
});

如果您使用的是Request类,则可以覆盖函数getValidatorInstance,以便应用条件规则:

protected function getValidatorInstance(){
    $validator = parent::getValidatorInstance();

    $validator->sometimes('image', 'mimes:jpeg;png,dimensions:min_width=800', function($value) {
        return $value instanceof UploadedFile;
    });

    return $validator;
}