#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. Или вы можете изменить структуру входных данных, чтобы они представляли собой массив имен и файлов, таким образом, вы можете проверить каждый элемент, чтобы убедиться, что отправлены как имя, так и файл