<?php
namespace App\EventListener\PostValidate;
use App\DTO\Popup\PopupMedia;
use App\DTO\Popup\PopupOutput;
use App\Entity\Popup;
use App\Service\AfterReadStorage;
use App\Service\Manager\MediaManager;
use App\Service\Manager\PopupManager;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpKernel\Event\ViewEvent;
use Symfony\Component\Serializer\Normalizer\NormalizerInterface;
class AddPopupMediaPostValidateTransformer implements EventSubscriberInterface
{
/**
* @var MediaManager
*/
private $mediaManager;
/**
* @var AfterReadStorage
*/
private $afterReadStorage;
/**
* @var PopupManager
*/
private $popupManager;
/**
* @var NormalizerInterface
*/
private $normalizer;
public function __construct(
MediaManager $mediaManager,
AfterReadStorage $afterReadStorage,
PopupManager $popupManager,
NormalizerInterface $normalizer
) {
$this->mediaManager = $mediaManager;
$this->afterReadStorage = $afterReadStorage;
$this->popupManager = $popupManager;
$this->normalizer = $normalizer;
}
/**
* @return array
*/
public static function getSubscribedEvents()
{
return [
PostValidateListener::POST_VALIDATE_TRANSFORMATION => 'transform',
];
}
/**
* @param PopupMedia $payload
*
* @return bool
*/
public function supportTransformation($payload)
{
return $payload instanceof PopupMedia;
}
/**
* @param ViewEvent $event
*/
public function transform(ViewEvent $event)
{
/** @var PopupMedia $payload */
$payload = $event->getControllerResult();
if (!$this->supportTransformation($payload)) {
return;
}
$media = $this->mediaManager->getOneByGuid($payload->media);
if (null === $media) {
return;
}
/** @var Popup $popup */
$popup = $this->afterReadStorage->getObject();
$popup = $this->popupManager->updateMedia($popup, $media);
$event->setResponse(new JsonResponse($this->normalizer->normalize($popup, PopupOutput::class)));
}
}