Здравствуйте.
Появилась необходимость проводить валидацию формы, в которой есть поля для загрузки множества файлов.
<input type="file" name="files[]" multiple />
Это поле обязательно, только если получаемое значение поля "type" равно 1.
Так как файлы передаются как массив, то логично настроить правила для них таким образом (с окончанием .*):
'files.*' => [ 'required_if:type,1', 'file', 'mimes:jpeg,jpg,png,pdf'] // неправильные правила
Но здесь, не смотря на правило required_if, если отправить форму без файлов, то никакой ошибки не будет, поэтому его имеет смысл убрать.
'files.*' => [ 'file', 'mimes:jpeg,jpg,png,pdf'], // правильные правила
Я пошел дальше и решил сделать еще одно правило, которое заодно проверяет, является ли поле массивом и ограничивающее количество принимаемых файлов.
'files' => [ 'required_if:type,1','array','max:10'], // правильные правила
Казалось бы - всё здорово, не так ли?
Но когда дело дошло до написания локализации полей (lang/fields.php), то появилась проблема:
Если записать локализацию поля так:
'files' => 'Файлы',
то:
Если записать так:
'files' => [ '*' => 'Файл',],
то:
при ошибках правила files вылезает ошибка:
ErrorException: mb_strtoupper() expects parameter 1 to be string, array given
Если записать так:
'files.*' => 'Файл',
то в любом случае все будет отображаться неправильно.
Собственно, спрашиваю вашего совета в том, как это побороть, может быть кто сталкивался.
Задать сообщения об ошибках, как вам нужно, можно в Form Request для вашей формы. Соответственно вам нужно создать этот самый кастомный Form Request (документация). Далее в нем вам доступен метод messages(). В нем, по аналогии с rules(), вы можете задать сообщения об ошибках для каждого поля в зависимости от правила, которое зафейлилось.
Конкретно в вашем случае Form request будет иметь примерно такой вид:
<?php
namespace App\Http\Requests;
use Illuminate\Foundation\Http\FormRequest;
class CustomFormRequest extends FormRequest
{
public function authorize()
{
// Здесь может быть проверка прав доступа к форме
return true;
}
public function rules()
{
return [
'files' => ['required_if:type,1', 'array', 'max:10'],
'files.*' => ['file', 'mimes:jpeg,jpg,png,pdf'],
];
}
public function messages()
{
// Здесь кастомные сообщения для каждого типа ошибки и поля
return [
'files.required' => 'Не забудьте приложить файлы',
// и т.д.
'files.*.file' => 'Должен быть файл',
'files.*.mime' => 'Не поддерживаемый формат',
];
}
}
Собственно, это тоже есть в документации.
Современные инструменты для криптотрейдинга: как технологии помогают принимать решения
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости