Laravel - Валидация и локализация массива (файлов)

309
25 ноября 2017, 11:31

Здравствуйте.

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

<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.0, files.1, files.2 и т.д.;
  • при ошибках правила files все отображается нормально;

Если записать так:

'files' => [ '*' => 'Файл',],

то:

  • при ошибках правила files.* все отображается нормально;
  • при ошибках правила files вылезает ошибка:

    ErrorException: mb_strtoupper() expects parameter 1 to be string, array given

Если записать так:

'files.*' => 'Файл',

то в любом случае все будет отображаться неправильно.

Собственно, спрашиваю вашего совета в том, как это побороть, может быть кто сталкивался.

Answer 1

Задать сообщения об ошибках, как вам нужно, можно в 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'   => 'Не поддерживаемый формат',
        ];
    }
}

Собственно, это тоже есть в документации.

READ ALSO
Warning: fsockopen(): unable to connect to (php_network_getaddresses: getaddrinfo failed: Temporary failure in name resolution)

Warning: fsockopen(): unable to connect to (php_network_getaddresses: getaddrinfo failed: Temporary failure in name resolution)

Установил битриксШтатными средствами проверяю его его на ошибки, выдает ошибку в работе с сокетами

305
Как в боте телеграм обратится к предыдущему сообщению?

Как в боте телеграм обратится к предыдущему сообщению?

Добрый день, хочу сделать меню с выбором нескольких настроекПишем Старт, Бот предлагает несколько вариантов ответа

186
xamp sendmail сообщение отправляется, но не приходит на почту

xamp sendmail сообщение отправляется, но не приходит на почту

Привет всем, задаю очередной вопрос по отправке сообщений с локального сервера на моем компьютереХотел заставить свой сайт отправлять на почту...

413
Почему зависает деплой на &ldquo;Adding BUILD_ENV to build environment&hellip;&rdquo;?

Почему зависает деплой на “Adding BUILD_ENV to build environment…”?

Есть репозиторий с проектом на CMS OpenCart

202