【问题标题】:Add Custom Conditional Validation rules to the same attribute将自定义条件验证规则添加到同一属性
【发布时间】:2017-10-22 03:22:44
【问题描述】:

我正在尝试为我的管理面板添加文件上传的自定义验证逻辑。现在我的文件字段可以返回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 向属性添加附加规则不能这样工作。验证器未处理添加的规则。

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

【问题讨论】:

  • 老实说,您为什么要为此创建自定义验证器是没有意义的。 Laravel 自带file 规则来检查文件是否上传成功。还有一些规则可以使它成为可选的。
  • 我需要验证许多不同类型的文件。像文档、图像、图像+pdf 等。并且 mime 规则只接受 UploadedFile 实例,并且如果我正在传递字符串则失败(我无法合理地避免,因为所有内容都包含在 FormRequest 中)
  • 那么你想要一个字符串值被成功处理而不是抛出一个错误?据我所知,规则filemimetypesmimes 以及sometimes 完全符合您的要求,除了字符串允许。我不确定您是如何在表单文件输入中获得字符串的。
  • @Sandeesh,我认为可以使用两种不同的形式。 1. 用户可以从 PC 中选择图像 2. 用户可以选择 url 或图像路径.. 两者都指向同一个请求
  • @manix 那么输入 url 并添加 required_unless 规则会不会更容易。

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


【解决方案1】:

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

使用验证器对象:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-03-02
    • 2014-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-25
    • 2014-10-18
    • 1970-01-01
    相关资源
    最近更新 更多