Laravel пропускает «обязательную» проверку файлов

#php #laravel #laravel-8 #laravel-validation

Вопрос:

у меня проблема с laravel 8, я действительно не знаю, что я делаю не так, но файлы пропускают требуемое правило при проверке, я отправляю форму с массивом имен и файлов и выполняю проверку в контроллере:

  public function store(StoreExamenRequest $examenRequest, StoreResultadoRequest $resultadoRequest)
 {
     $validacionExamen = $examenRequest->validated();
     $validacionResultado = $resultadoRequest-validated(); 
 

часть, которая не проверяет файл, заключается $resultadoRequest-validated(); в том, что это содержимое StoreResultadoRequest

 class StoreResultadoRequest extends FormRequest {
 public function authorize()
 {
     return true;
 }

 public function rules()
 {
     $this->redirect => url()->previous();

     return [
         'NombreResultado.*' => 'required|string',
         'ArchivoResultado.*' => 'required|file|mimes:pdf|max:1024',
     ];
 }

 public function messages()
 {
     return [
         'NombreResultado.required' => __('NombreResultado.required'),
         'ArchivoResultado.required' => __('ArchivoResultado.required'),
         'ArchivoResultado.file' => __('ArchivoResultado.file'),
         'ArchivoResultado.mimes' => __('ArchivoResultado.mimes'),
         'ArchivoResultado.max' => __('ArchivoResultado.max')
      ];
     }
 }
 

NombreResultado.required требуемое правило проверяется нормально, проблема в ArchivoResultado.required том, что оно проверяет все правила, кроме required правила. Я попытался удалить все остальные правила и оставить только это правило, но оно не работает. Это происходит dd $validacionResultado в контроллере, когда я отправляю форму без файла:

  array:1 [
       "NombreResultado" => array:1 [
         0 => "Name of the file"
       ]
 ]
 

Это dd с прикрепленным файлом:

 array:2 [
   "NombreResultado" => array:1 [
     0 => "Name of the file"
   ]
   "ArchivoResultado" => array:1 [
     0 => IlluminateHttpUploadedFile {#1328
       -test: false
       -originalName: "factura_00000525.pdf"
       -mimeType: "application/pdf"
       -error: 0
       #hashName: null
       path: "/private/var/tmp"
       filename: "phpoVUvWV"
       basename: "phpoVUvWV"
       pathname: "/private/var/tmp/phpoVUvWV"
       extension: ""
       realPath: "/private/var/tmp/phpoVUvWV"
       aTime: 2021-03-13 04:53:56
       mTime: 2021-03-13 04:53:56
       cTime: 2021-03-13 04:53:56
       inode: 80503611
       size: 136213
       perms: 0100600
       owner: 70
       group: 0
       type: "file"
       writable: true
       readable: true
       executable: false
       file: true
       dir: false
       link: false
     }
   ]
 ]
 

я не прикрепляю dd $resultadoRequest ссылку, потому что она слишком длинная. Не могли бы вы, пожалуйста, указать мне правильное направление?

Комментарии:

1. $this-redirect = url()-previous(); отсутствует > : $this->redirect = url()->previous(); . А также $examenRequest-validated() и $resultadoRequest-validated()

2. это была ошибка, когда я пытался опубликовать код, stackoverflow выдавал мне ошибку в форматировании кода, мне пришлось удалить все >

3. Не вводите свой код здесь, скопируйте/вставьте его, он работает как заклинание и предотвращает опечатки. Есть => $validacionExamen => $examenRequest->validated(); еще одна опечатка? Я ухожу

Ответ №1:

Вы хотите проверить, что массив файлов присутствует, а не пуст, затем проверьте каждый файл в массиве. У вас уже есть часть, которая проверяет каждый файл в массиве, поэтому добавьте проверку самого массива.

  return [
     'NombreResultado.*' => 'required|string',
     'ArchivoResultado' => 'required|array',
     'ArchivoResultado.*' => 'required|file|mimes:pdf|max:1024',
 ];
 

Комментарии:

1. Это поможет, если будет отправлен только 1 файл, но когда я отправляю несколько файлов, он пропускает требуемое правило. если я проверю отправку, это отправит 2 массива имен и 1 массив файлов

2. это не пропускает требуемое правило, ваше требование просто отличается от того, что требуется. Чтобы проверить, совпадает ли количество имен и файлов, вам придется написать пользовательскую проверку.

3. Или вы можете изменить структуру входных данных, чтобы они представляли собой массив имен и файлов, таким образом, вы можете проверить каждый элемент, чтобы убедиться, что отправлены как имя, так и файл