Какие есть пакеты для загрузки нескольких файлов в Symfony 5 под Easy admin?

В Symfony 5 под EasyAdmin для загрузки нескольких файлов вы можете использовать пакеты VichUploaderBundle и LiipImagineBundle.

VichUploaderBundle предоставляет интеграцию с Symfony для загрузки файлов на сервер. Он позволяет добавить аннотации к вашей сущности, чтобы определить поле, в котором будут сохраняться файлы, а также определить настройки для хранения, обработки и отображения этих файлов.

Чтобы начать использовать VichUploaderBundle, вам необходимо включить его в ваш проект и настроить его. Сначала добавьте бандл в ваши зависимости с помощью Composer. Выполните команду composer require vich/uploader-bundle, чтобы установить пакет.

После установки вы должны включить бандл в вашем ядре Symfony, добавив его в AppKernel.php:

$bundles = [
    // ...
    new VichUploaderBundleVichUploaderBundle(),
    // ...
];

Затем необходимо настроить VichUploaderBundle. Создайте файл с конфигурацией vich_uploader.yaml в папке config/packages. Пример конфигурации может выглядеть следующим образом:

vich_uploader:
    db_driver: orm
    mappings:
        upload_images:
            uri_prefix:         /images/uploads
            upload_destination: '%kernel.project_dir%/public/images/uploads'
            namer:              vich_uploader.namer_original_directory
            inject_on_load:     false
            delete_on_update:   true
            delete_on_remove:   true

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

Далее вы должны добавить аннотации к вашей сущности, указав поле, в котором будут сохраняться файлы. Например:

use VichUploaderBundleMappingAnnotation as Vich;

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

    /**
     * @ORMColumn(type="string", length=255)
     * @var string|null
     */
    private $image;

    /**
     * @VichUploadableField(mapping="upload_images", fileNameProperty="image")
     * @var File|null
     */
    private $imageFile;

    // ...

    public function getImageFile(): ?File
    {
        return $this->imageFile;
    }

    public function setImageFile(?File $imageFile): void
    {
        $this->imageFile = $imageFile;

        if ($imageFile) {
            // Force the property to be updated as the Doctrine will not detect changes made to the File
            $this->updatedAt = new DateTimeImmutable();
        }
    }

    // ...
}

В этом примере мы добавили поле image, которое будет хранить название файла, и поле imageFile, которое будет хранить объект File, представляющий загруженный файл. Мы также добавили методы getImageFile() и setImageFile(), чтобы получить и установить значение поля imageFile.

Теперь, когда вы настроили VichUploaderBundle для вашего приложения Symfony, вы можете использовать его в EasyAdmin. Для этого вы должны настроить соответствующий тип поля в вашей конфигурации EasyAdmin.

Например, если вы хотите добавить поле загрузки файлов в сущность "Продукт", вы можете создать файл конфигурации easy_admin.yaml в папке config/packages. Пример конфигурации может выглядеть следующим образом:

easy_admin:
    entities:
        Product:
            class: AppEntityProduct
            form:
                fields:
                    - { property: 'name' }
                    - { property: 'imageFile', type: 'file', type_options: { widget: 'single_upload' } }

В этом примере мы добавили поле imageFile в форму для сущности Product. Мы указали тип file для этого поля и опцию widget: 'single_upload', чтобы определить, что мы хотим загрузить только один файл.

Теперь, когда вы настроили поле загрузки файлов для сущности Product, вы должны увидеть его в EasyAdmin при создании или редактировании записей.

Если вы хотите загружать несколько файлов одновременно, вы можете использовать тип collection и настроить соответствующие настройки для VichUploaderBundle. В этом случае вы также можете добавить отношение "OneToMany" к вашей сущности для хранения информации о загруженных файлах.

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