Laravel 5.4:如何验证具有相同名称的文件输入数组?

时间:2018-12-07 04:28:40

标签: php laravel validation input laravel-5.4

我有多个文件输入

<input name="test[]" type="file">
<input name="test[]" type="file">
<input name="test[]" type="file">

我要验证上传的文件数是否不超过2。

我的验证规则是

'test.*' => 'bail|required|max_files_allowed:2|mimetypes:image/jpeg,image/gif,image/png,max:5000'

我的验证规则是

Validator::extend('max_files_allowed', function ($attribute, $value, $parameters, $validator) {

        //$attribute = "test.0"
        $field_name = explode(".",$attribute)[0];
        $files = $validator->getData()[$field_name];


        return (count($files) <= $parameters[0]) ? true : false;
    },"You reached the max number of files allowed.");

这是\Log::info($validator->getData())

的示例
     array (
   'test' => 
   array (
     0 => 
     Illuminate\Http\UploadedFile::__set_state(array(
        'test' => false,
        'originalName' => '2018-05-23_1421.png',
        'mimeType' => 'image/png',
        'size' => 50101,
        'error' => 0,
        'hashName' => NULL,
     )),
     1 => 
     Illuminate\Http\UploadedFile::__set_state(array(
        'test' => false,
        'originalName' => '2018-07-26_1752.png',
        'mimeType' => 'image/png',
        'size' => 105617,
        'error' => 0,
        'hashName' => NULL,
     )),
   ),
 )

当我的验证规则失败时,它会打印多条错误消息。
我假设这是因为它针对数组中的每个元素运行验证规则。
我该怎么做才能使错误消息仅显示一次?
或者我计算提交文件数量的方法不正确吗?

3 个答案:

答案 0 :(得分:0)

您可以仅返回并显示您收到的第一个错误消息,如下所示。

 if($validator->fails()){
        $error = $validator->errors()->first();

        $responseData = [
            'status' => 'failure',
            'msg' => $error
        ];

        return json_encode($responseData);
    }

答案 1 :(得分:0)

您可以将验证规则分为两个验证规则:

'test' => 'bail|required|max_files_allowed:2'
'test.*' => 'bail|required|mimetypes:image/jpeg,image/gif,image/png,max:5000'

并将您的自定义验证规则更改为:

Validator::extend('max_files_allowed', function ($attribute, $value, $parameters, $validator) {
    //$attribute is now "test" not "test.0" 
    $field_name = $attribute;
    $files = $validator->getData()[$field_name];


    return (count($files) <= $parameters[0]) ? true : false;
},"You reached the max number of files allowed.");

因此,通过此修改,您首先要单独验证阵列,然后再使用第二条验证规则来验证每个文件。

注意:未经测试,但可以正常工作。

答案 2 :(得分:0)

使用maxarray来强制test为数组,因此min将检查数组中的项数。

'test' => 'array|max:2',
'test.*' => 'bail|required|mimetypes:image/jpeg,image/gif,image/png,max:5000'