<?php
namespace App\EventSubscriber;
use ApiPlatform\Symfony\EventListener\EventPriorities;
use ApiPlatform\Util\RequestAttributesExtractor;
use App\Entity\MediaObject;
use App\Entity\Product;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpKernel\Event\ViewEvent;
use Symfony\Component\HttpKernel\KernelEvents;
use Vich\UploaderBundle\Storage\StorageInterface;
final class ResolveProductMediaObjectContentUrlSubscriber implements EventSubscriberInterface
{
public function __construct(private readonly StorageInterface $storage)
{
}
public static function getSubscribedEvents(): array
{
return [
KernelEvents::VIEW => ['onPreSerialize', EventPriorities::PRE_SERIALIZE],
];
}
public function onPreSerialize(ViewEvent $event): void
{
$controllerResult = $event->getControllerResult();
$request = $event->getRequest();
if ($controllerResult instanceof Response || !$request->attributes->getBoolean('_api_respond', true)) {
return;
}
if (!($attributes = RequestAttributesExtractor::extractAttributes($request)) || !\is_a($attributes['resource_class'], Product::class, true)) {
return;
}
$products = $controllerResult;
if (!is_iterable($products)) {
$products = [$products];
}
foreach ($products as $product) {
/** @var $product Product */
if (!$product instanceof Product) {
continue;
}
$packshot = $product->getPackshot();
if($packshot instanceof MediaObject){
$product->packshotUrl = $this->storage->resolveUri($packshot, 'file');
}
$producerImage = $product->getProducerImage();
if($producerImage instanceof MediaObject){
$product->producerImageUrl = $this->storage->resolveUri($producerImage, 'file');
}
}
}
}