<?phpnamespace App\EventSubscriber;use Doctrine\ORM\EntityManagerInterface;use Symfony\Component\EventDispatcher\EventSubscriberInterface;use Symfony\Component\HttpKernel\Event\ControllerEvent;use Symfony\Component\HttpKernel\KernelEvents;use Vich\UploaderBundle\Event\Event;use Vich\UploaderBundle\Event\Events;use Vich\UploaderBundle\Templating\Helper\UploaderHelper;use App\Service\ImageOptimizer;use App\Service\DocumentScanner;use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface;use Symfony\Component\HttpFoundation\File\File;use Symfony\Component\HttpFoundation\File\UploadedFile;class ImageUpoadGlobalSubscriber implements EventSubscriberInterface { /** * @var App\Service\ImageOptimizer */ private $imageOptimizer; /** * @var DocumentScanner */ private $documentScanner; private $tmpFile; public function __construct( ImageOptimizer $imageOptimizer, UploaderHelper $uploaderHelper, ParameterBagInterface $parameterBag, DocumentScanner $documentScanner ) { $this->imageOptimizer = $imageOptimizer; $this->uploaderHelper = $uploaderHelper; $this->parameterBag = $parameterBag; $this->documentScanner = $documentScanner; $this->tmpFile = ""; } public static function getSubscribedEvents(): array { return [ Events::PRE_UPLOAD => 'onPreUpload', Events::POST_UPLOAD => 'onPostUpload', ]; } public function onPreUpload(Event $event) { $object = $event->getObject(); $tmpFolder = $this->parameterBag->get('kernel.project_dir') . DIRECTORY_SEPARATOR . "tmp"; switch (get_class($object)) { case 'App\Entity\MessageAttachement': $getter = 'getAttachementFile'; $setter = 'setAttachementFile'; break; case 'App\Entity\Service': $getter = 'getPictureFile'; $setter = 'setPictureFile'; break; case 'App\Entity\Company': $getter = 'getLogoFile'; $setter = 'setLogoFile'; break; case 'App\Entity\MeasurementReportRoomPhoto': $getter = 'getPhotoFile'; $setter = 'setPhotoFile'; break; default: $getter = 'getDocumentFile'; $setter = 'setDocumentFile'; break; } $name = $object->{$getter}()->getClientOriginalName(); $mime = $object->{$getter}()->getClientMimeType(); $this->tmpFile = $tmpFolder.DIRECTORY_SEPARATOR.$name; $object->{$getter}()->move($tmpFolder, $name); $this->imageOptimizer->resize($this->tmpFile); $file = new UploadedFile( $this->tmpFile, $name, $mime); $object->{$setter}($file); // Send the (already-local) image to ScanKit and store the optimized // derivative. Sets optimizedName on $object; persisted via Vich's // recomputeChangeSet (update) or the insert (new). Degrades gracefully. $this->documentScanner->scanFromLocalFile($object, $this->tmpFile); } public function onPostUpload(Event $event): void { unlink(($this->tmpFile)); }}