В 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 позволяет создавать измененные версии загружаемых файлов. Это полезно, если вы хотите, чтобы загруженные фотографии автоматически выполнялись в различных размерах, обрезались или изменялись другим образом.