Понадобилось мне, помимо загруженного файла, хранить его уменьшенную версию и несколько превьюшек. `#[AsEventListener(Events::POST_UPLOAD)] #[AsEventListener(Events::PRE_REMOVE)] class VichUploaderListener { public function __construct( private ImageManipulatorService $imageManipulatorService, // Какой-то сервис, в котором происходят обработки private StorageInterface $storage, // В документации о нем ни слова, но этот сервис помогает получать реальные пути файлов ) {}

// Данное событие вызывается после загрузки файла, когда он уже находится в хранилище public function onVichUploaderPostUpload(Event $evt): void { $mapping = $evt->getMapping(); // Тут лежат описания свойств самого VichUploader $object = $evt->getObject(); // Тут лежит объект, которому принадлежит файл

$resize = $this->getResizeAttribute($object, $mapping);

if ($resize) { $this->imageManipulatorService->process( $this->storage->resolvePath($object, $mapping->getFilePropertyName()), $resize, ); } }

// Данное событие происходит ровно перед физическим удалением файла public function onVichUploaderPreRemove(Event $evt): void { $mapping = $evt->getMapping(); $object = $evt->getObject();

$resize = $this->getResizeAttribute($object, $mapping);

if ($resize) { $this->imageManipulatorService->clear( $this->storage->resolvePath($object, $mapping->getFilePropertyName()), $resize, ); } }

protected function getResizeAttribute($object, $mapping): ?ImageManipulatorField { $property = $mapping->getFilePropertyName(); // Название свойства, которое обрабатывает бандл $reflectionProperty = new ReflectionProperty($object, $property); $attributes = $reflectionProperty->getAttributes(ImageManipulatorField::class);

// ImageManipulatorField - кастомный атрибут, которым можно пометить свойство в сущности, рядом с UploadableField // В атрибут можно передавать, например, желаемые ресайз размеры

if (empty($attributes)) { return null; }

return $attributes[0]->newInstance(); } } Думал использовать https://github.com/liip/LiipImagineBundle, а он слишком избыточен для решения данной задачи. Поэтому скидал простенькое решение. Что особенно порадовало, что исходный бандл озаботился выкидыванием нужных мне ивентов.`