<?php
namespace App\EventListener;
use ApiPlatform\Core\Api\IriConverterInterface;
use ApiPlatform\Core\Util\RequestAttributesExtractor;
use App\Custom\RequestEventContentValidator;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpKernel\Event\RequestEvent;
use ApiPlatform\Core\EventListener\DeserializeListener as DecoratedListener;
use Symfony\Component\HttpKernel\KernelInterface;
use Symfony\Component\Serializer\Exception\ExceptionInterface;
use Symfony\Component\Serializer\Normalizer\DenormalizerInterface;
use ApiPlatform\Core\Serializer\SerializerContextBuilderInterface;
final class DeserializerValidatorListener
{
private DecoratedListener $decorated;
private DenormalizerInterface $denormalizer;
private SerializerContextBuilderInterface $serializerContextBuilder;
private RequestEventContentValidator $requestEventContentValidator;
public function __construct(
DenormalizerInterface $denormalizer,
SerializerContextBuilderInterface $serializerContextBuilder,
DecoratedListener $decorated,
RequestEventContentValidator $requestEventContentValidator
)
{
$this->denormalizer = $denormalizer;
$this->serializerContextBuilder = $serializerContextBuilder;
$this->decorated = $decorated;
$this->requestEventContentValidator = $requestEventContentValidator;
}
/**
* @throws ExceptionInterface|\ReflectionException
*/
public function onKernelRequest(RequestEvent $event): void {
$request = $event->getRequest();
if ($request->isMethodCacheable() || $request->isMethod(Request::METHOD_DELETE)) {
return;
}
// if ($request->isMethod(Request::METHOD_POST) ||
// $request->isMethod(Request::METHOD_PUT) ||
// $request->isMethod(Request::METHOD_PATCH)
// ) {
// $this->requestContentIdDecoder->decode($request);
// }
if ('form' === $request->getContentType()) {
$this->denormalizeFormRequest($request);
} else {
$this->requestEventContentValidator->validate($event);
$this->decorated->onKernelRequest($event);
}
}
/**
* @throws ExceptionInterface
*/
private function denormalizeFormRequest(Request $request): void
{
if (!$attributes = RequestAttributesExtractor::extractAttributes($request)) {
return;
}
$context = $this->serializerContextBuilder->createFromRequest($request, false, $attributes);
$populated = $request->attributes->get('data');
if (null !== $populated) {
$context['object_to_populate'] = $populated;
}
$data = $request->request->all();
$object = $this->denormalizer->denormalize($data, $attributes['resource_class'], null, $context);
$request->attributes->set('data', $object);
}
}