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

Php 将自定义条件验证规则添加到同一属性,php,laravel,validation,laravel-5,laravel-5.4,Php,Laravel,Validation,Laravel 5,Laravel 5.4,我正在尝试为我的管理面板的文件上传添加自定义验证逻辑。现在我的文件字段可以返回illighted\Http\UploadedFile或string | null,如果文件未上载或更改或其他情况。我正在做的是,我创建了一个自定义规则,如下所示: 'image' => [ 'required', 'admin_file:mimes:jpeg;png,dimensions:min_width=800;min_height=600' ] 然后我解析我传递的所有参数,问题是,我自然

我正在尝试为我的管理面板的文件上传添加自定义验证逻辑。现在我的文件字段可以返回
illighted\Http\UploadedFile
string | 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;
    }
}

我看到的是,您有时在规则内部使用
。从我的角度来看,你需要把它去掉,甚至不用自定义类就更好了

使用验证程序对象:

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

$validator->sometimes('image', 'mimes:jpeg;png,dimensions:min_width=800', function($value) {
    return $value instanceof UploadedFile;
});
如果您使用的是请求类,则可以重写函数
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;
}

老实说,您为什么要为此创建自定义验证器是毫无意义的。Laravel附带了
文件
规则来检查文件是否已成功上传。还有一些规则使其成为可选的。有许多不同类型的文件需要验证。像文档、图像、图像+pdf等。mime规则只接受
UploadedFile
实例,如果传递字符串(这是我无法合理避免的,因为所有内容都被包装到
FormRequest
)则会失败,所以您希望成功处理字符串值,而不是抛出错误?据我所见,规则
文件
mimetypes
mimes
以及
有时
完全满足您的需要,除了字符串余量。我不确定您是如何在表单文件输入中获得字符串的。@Sandeesh,我假设有两种不同的表单可以使用。1.用户可以从PC 2中选择图像。用户可以在其中选择url或图像路径。。他们都指向同一个方向request@manix那么,有一个url输入并添加一个必需的规则不是更容易吗。