Laravel: иногда правило не работает с типом ввода = файл

Я создаю FormRequest, который проверяет, содержит ли оно изображение в зависимости от имени его поля. Вот как выглядят мои правила:

public function rules(){
    return [
        'username'              => 'required|exists:users',
        'key'                   => 'required|exists:users,activation_key',
        'id'                    => 'sometimes|required|array|min:2',
        'id.*'                  => 'sometimes|required|file|mimes:jpeg,jpg,png|max:5000',
        'documents'             => 'sometimes|required|array|min:4',
        'documents.*'           => 'sometimes|required|file|mimes:jpeg,jpg,png,doc,pdf,docx,zip|max:5000',
        'g-recaptcha-response'  => 'required',
    ];
}

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

Мой запрос сделан через Jquery.ajax() и используя new FormData($('selector')[0]) чтобы получить значения поля. У меня есть мои параметры AJAX правильно, так что из этого фактора.

Проблема в том, что при выполнении HTTP-запроса с пустой формой проверяется только username, key, а также g-recaptcha-response

Дальнейшая отладка показывает, что удаление sometimes Правило заставляет это работать. Но мне нужно только условно проверить один (например, /upload-id покажет только id[] поля и /upload-documents покажет только document[] поля).

1 ответ

Оказывается, проблема заключается в том, что она несколько игнорирует пустую input[type=file] массивы и не добавляет его в мешок параметров в Request Учебный класс. Обходной путь, который я сделал, был с помощью required_if правила проверки элементов массива таковы:

public function rules(){
    return [
        'username'              => 'required|exists:users',
        'key'                   => 'required|exists:users,activation_key',
        'account_type'          => ['required', Rule::in(['individual', 'business'])],
        'id'                    => 'nullable|array|min:2',
        'id.*'                  => 'required_if:account_type,individual|file|mimes:jpeg,jpg,png|max:5000',
        'documents'             => 'nullable|array|min:4',
        'documents.*'           => 'required_if:account_type,business|file|mimes:jpeg,jpg,png,doc,pdf,docx,zip|max:5000',
        'g-recaptcha-response'  => 'required'
    ];
}

здесь, у меня есть определитель, по которому между двумя будут проверены, так что если account_type = individal, это будет только проверить глубже в id массив

Другие вопросы по тегам