Laravel 5.4: Как мне проверить массив входных файлов с тем же именем? - PullRequest
0 голосов
/ 07 декабря 2018

У меня есть несколько файловых вводов

<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 голосов
/ 07 декабря 2018

Вы можете разделить свое правило проверки на два правила проверки:

'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.");

, поэтому с помощью этой модификации сначала вы проверяете массивтолько после этого вы проверяете каждый файл, используя второе правило проверки.

Примечание: не проверено, но оно должно работать.

0 голосов
/ 07 декабря 2018

Используйте max и array для принудительного применения test в качестве массива, поэтому min проверяет количество элементов в массиве.

'test' => 'array|max:2',
'test.*' => 'bail|required|mimetypes:image/jpeg,image/gif,image/png,max:5000'
0 голосов
/ 07 декабря 2018

Вы можете просто вернуться и отобразить первое сообщение об ошибке, которое вы получили вот так.

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

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

        return json_encode($responseData);
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...