Проверить максимальное количество нескольких файлов, которые могут быть прикреплены в Laravel Validation

У меня есть форма, позволяющая прикрепить несколько файлов.

Я проверяю форму для поля вложения как:

$this->validate($request, [

            'attachments.*' => 'mimes:jpg,jpeg,bmp,png|max:5000',
        ]);

Он работает правильно, но я также хочу разрешить одновременную загрузку не более 3 файлов.

Как мне этого добиться?

Для этого вам нужно добавить собственное правило: laravel.com/docs/5.6/validation#custom-validation-rules

DsRaj 26.06.2018 09:21
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
4
1
3 684
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Есть возможность добавить Пользовательские правила проверки в laravel.

Также вы можете попробовать что-то вроде этого:

$this->validate($request, [
    'attachments.*' => [
        'mimes:jpg,jpeg,bmp,png',
        function($attribute, $value, $fail) {
            if (count($value) > 3) {
                return $fail($attribute . ' should be less than or equal to 3.');
            }
        },
    ]
]);

Здесь опубликовано еще одно решение: Как проверить количество файлов

Ответ принят как подходящий

Поскольку attachments является массивом, вы можете использовать правило max для проверки его максимальных элементов как 3.

 $messages = [
    "attachments.max" => "file can't be more than 3."
 ];

 $this->validate($request, [

        'attachments.*' => 'mimes:jpg,jpeg,bmp,png|max:5000',
        'attachments' => 'max:3',
    ],$messages);

Хорошо, это работает, но ошибка говорит: вложения не могут быть длиннее 3 символов. Итак, как я могу создать для этого собственное сообщение?

Raj 26.06.2018 09:37

@Raj -Naam to suna hoga: обновлено специальным сообщением.

freelancer 26.06.2018 09:42

Я думаю, что лучший способ - создать новое правило проверки.

Согласно Laravel 8 мне удалось так:

1- Создал новое правило, выполнив эту команду:

php artisan make:rule UploadCount

2- Найдите новое правило UploadCount.php в разделе app/Rules и вставьте это:

public function passes($attribute, $value)
{

    return (count($value) <= '5') ? true : false;
}

/**
 * Get the validation error message.
 *
 * @return string
 */
public function message()
{
    if ( \Config::get('app.locale') == 'en') {
        return 'You cannot upload more than 5 images';
    } else {
        return 'Non puoi caricare piu di 5 immagini';
    }

}

Если вы видите, в моем случае ограничение составляет 5 файлов, но вы можете его изменить.

P.S. Я не удалял if statement из метода message(), потому что кому-то может понадобиться, чтобы он имел разные сообщения в случае локализации, иначе вы можете использовать папку lang с автоматическими сообщениями. Если ваш проект не является многоязычным, вы можете просто:

return 'You cannot upload more than 5 images';

3- Теперь в вашем запросе формы вы должны:

Импортируйте UploadCount: use App\Rules\UploadCount;.

а также:

public function rules()
{
    return [
        'images'            => 'required|mimes:jpeg,jpg,png|max:32768',
        'images'            => [new UploadCount()],
    ];
}

Удачного кодирования!

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