Понадобилось мне, помимо загруженного файла, хранить его уменьшенную версию и несколько превьюшек. `#[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, а он слишком избыточен для решения данной задачи. Поэтому скидал простенькое решение. Что особенно порадовало, что исходный бандл озаботился выкидыванием нужных мне ивентов.`