<?php
namespace App\EventListener\PostValidate;
use App\DTO\SiteStatus\SiteStatus;
use App\Entity\Site;
use App\Entity\SiteStatus as Entity;
use App\Repository\SiteRepository;
use App\Service\AfterReadStorage;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\RequestStack;
use Symfony\Component\HttpKernel\Event\ViewEvent;
class CreateSiteStatusPostValidateTransformer implements EventSubscriberInterface
{
private $request;
private $afterReadStorage;
private $siteRepository;
public function __construct(
RequestStack $requestStack,
AfterReadStorage $afterReadStorage,
SiteRepository $siteRepository
)
{
$this->request = $requestStack->getCurrentRequest();
$this->afterReadStorage = $afterReadStorage;
$this->siteRepository = $siteRepository;
}
/**
* @return array
*/
public static function getSubscribedEvents()
{
return [
PostValidateListener::POST_VALIDATE_TRANSFORMATION => 'transform',
];
}
/**
* @param SiteStatus $payload
*
* @return bool
*/
public function supportTransformation($payload)
{
return $payload instanceof SiteStatus;
}
/**
* @param ViewEvent $event
*/
public function transform(ViewEvent $event)
{
/** @var SiteStatus $payload */
$payload = $event->getControllerResult();
if (!$this->supportTransformation($payload)) {
return;
}
/** @var Site $site */
$site = $this->siteRepository->find($this->request->get('id'));
if ($event->getRequest()->isMethod(Request::METHOD_PUT)) {
/** @var Entity $siteStatus */
$siteStatus = $this->afterReadStorage->getObject();
$siteStatus->update($payload->name);
$event->setControllerResult($siteStatus);
} elseif ($event->getRequest()->isMethod(Request::METHOD_POST)) {
$siteStatus = Entity::create($site, $payload->name);
$event->setControllerResult($siteStatus);
}
}
}