src/EventSubscriber/ResolveMediaObjectContentUrlSubscriber.php line 69

Open in your IDE?
  1. <?php
  2. namespace App\EventSubscriber;
  3. use ApiPlatform\Core\EventListener\EventPriorities;
  4. use ApiPlatform\Core\Util\RequestAttributesExtractor;
  5. use App\Entity\Details\Operation\DetailsStep;
  6. use App\Entity\MediaObject\MediaCoupon;
  7. use App\Entity\MediaObject\MediaMultiOffer;
  8. use App\Entity\MediaObject\MediaObject;
  9. use App\Entity\MediaObject\MediaParticipation;
  10. use App\Entity\Operation\Coupon;
  11. use App\Entity\Participation\Participation;
  12. use App\Entity\Participation\Step;
  13. use Doctrine\ORM\EntityManagerInterface;
  14. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  15. use Symfony\Component\HttpFoundation\RequestStack;
  16. use Symfony\Component\HttpFoundation\Response;
  17. use Symfony\Component\HttpKernel\Event\ViewEvent;
  18. use Symfony\Component\HttpKernel\KernelEvents;
  19. use Vich\UploaderBundle\Storage\StorageInterface;
  20. final class ResolveMediaObjectContentUrlSubscriber implements EventSubscriberInterface
  21. {
  22.     private const RESOURCE_CLASS_CHECK = [
  23.         MediaObject::class,
  24.         MediaCoupon::class,
  25.         MediaMultiOffer::class,
  26.         MediaParticipation::class,
  27.         Participation::class,
  28.         Step::class,
  29.         DetailsStep::class,
  30.     ];
  31.     private $storage;
  32.     /**
  33.      * @var EntityManagerInterface
  34.      */
  35.     private EntityManagerInterface $em;
  36.     /**
  37.      * @var RequestStack
  38.      */
  39.     private RequestStack $requestStack;
  40.     /**
  41.      * ResolveMediaObjectContentUrlSubscriber constructor.
  42.      * @param StorageInterface $storage
  43.      * @param EntityManagerInterface $em
  44.      * @param RequestStack $requestStack
  45.      */
  46.     public function __construct(
  47.         StorageInterface $storage,
  48.         EntityManagerInterface $em,
  49.         RequestStack $requestStack
  50.     )
  51.     {
  52.         $this->storage $storage;
  53.         $this->em $em;
  54.         $this->requestStack $requestStack;
  55.     }
  56.     public static function getSubscribedEvents(): array
  57.     {
  58.         return [
  59.             KernelEvents::VIEW => ['onPreSerialize'EventPriorities::PRE_SERIALIZE],
  60.         ];
  61.     }
  62.     public function onPreSerialize(ViewEvent $event): void
  63.     {
  64.         $controllerResult $event->getControllerResult();
  65.         $request $event->getRequest();
  66.         if ($controllerResult instanceof Response || !$request->attributes->getBoolean('_api_respond'true)) {
  67.             return;
  68.         }
  69.         if (!$attributes RequestAttributesExtractor::extractAttributes($request)) {
  70.             return;
  71.         }
  72.         $valid false;
  73.         foreach (self::RESOURCE_CLASS_CHECK as $resourceClass) {
  74.             if (!\is_a($attributes['resource_class'], $resourceClasstrue)) {
  75.                 $valid true;
  76.             }
  77.         }
  78.         if (!$valid) {
  79.             return;
  80.         }
  81.         $objects $controllerResult;
  82.         if (!is_iterable($objects)) {
  83.             $objects = [$objects];
  84.         }
  85.         foreach ($objects as $object) {
  86.             if ($object instanceof Step) {
  87.                 $this->resolveContentUrl($object->getInvoices()->toArray());
  88.                 continue;
  89.             }
  90.             if ($object instanceof Coupon) {
  91.                 $this->resolveContentUrl($object->getDetails()->getImages());
  92.                 continue;
  93.             }
  94.             if (!$object instanceof MediaObject) {
  95.                 continue;
  96.             }
  97.             $this->resolveContentUrl([$object]);
  98.         }
  99.     }
  100.     private function resolveContentUrl(iterable $mediaObjects)
  101.     {
  102.         foreach ($mediaObjects as $mediaObject) {
  103.             if (!$mediaObject instanceof MediaObject) {
  104.                 continue;
  105.             }
  106.             $contentUrl $this->storage->resolveUri($mediaObject'file');
  107.             $contentUrl $this->requestStack->getCurrentRequest()->getUriForPath($contentUrl);
  108.             $mediaObject->setContentUrl($contentUrl);
  109.         }
  110.     }
  111. }