Загрузка множества файлов в Swagger-Symfony?

Для загрузки множества файлов в Swagger-Symfony есть несколько подходов, которые могут быть применены в зависимости от требований проекта. Рассмотрим несколько из них.

1. Вариант с использованием форм Symfony. В этом случае можно создать форму для выбора файлов, а затем обработать отправку формы в контроллере. Для загрузки множества файлов можно использовать поле формы типа "collection". Добавьте в вашу форму это поле следующим образом:

use SymfonyComponentFormExtensionCoreTypeCollectionType;
use SymfonyComponentFormExtensionCoreTypeFileType;
use SymfonyComponentFormExtensionCoreTypeTextType;
use SymfonyComponentFormFormBuilderInterface;

public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder
        // ...
        ->add('files', CollectionType::class, [
            'entry_type' => FileType::class,
            'allow_add' => true,
            'allow_delete' => true,
            'by_reference' => false,
        ])
        // ...
}

Затем в контроллере обработайте отправку формы следующим образом:

use SymfonyComponentHttpFoundationRequest;

public function uploadFiles(Request $request)
{
    $form = $this->createForm(...);
    $form->handleRequest($request);

    if ($form->isSubmitted() && $form->isValid()) {
        $files = $form->get('files')->getData(); // получаем загруженные файлы

        // обработка файлов

        // ...
    }

    // ...
}

2. Еще один вариант - использование библиотеки VichUploaderBundle, которая упрощает загрузку и управление файлами. Прежде всего, установите VichUploaderBundle:

composer require vich/uploader-bundle

Затем настройте его для вашего проекта, добавив конфигурацию в файл config/packages/vich_uploader.yaml:

vich_uploader:
    db_driver: orm
    mappings:
        uploaded_files:
            uri_prefix: /uploads/files
            upload_destination: '%kernel.project_dir%/public/uploads/files'
            namer: VichUploaderBundleNamingUniqidNamer
            inject_on_load: true
            delete_on_remove: true

Ваша сущность Symfony должна быть настроена для работы с VichUploaderBundle. Например:

use DoctrineORMMapping as ORM;
use SymfonyComponentHttpFoundationFileFile;
use SymfonyComponentValidatorConstraints as Assert;
use VichUploaderBundleMappingAnnotation as Vich;

/**
 * @ORMEntity
 * @VichUploadable
 */
class MyEntity
{
    // ...

    /**
     * @VichUploadableField(mapping="uploaded_files", fileNameProperty="fileName")
     * @AssertAll({
     *   @AssertFile(
     *     maxSize="10M"
     *   )
     * })
     */
    private $files;

    /**
     * @ORMColumn(type="string", nullable=true)
     */
    private $fileName;

    // ...
}

Теперь вы можете создать форму, аналогичную первому варианту, и обрабатывать ее отправку в контроллере с использованием VichUploaderBundle.