<?php
namespace App\EventSubscriber;
use Knp\Component\Pager\Event\Subscriber\Sortable\Doctrine\ORM\Query\OrderByWalker;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\HttpKernel\Event\ExceptionEvent;
use Symfony\Component\HttpKernel\KernelEvents;
use UnexpectedValueException;
class InvalidPaginationSortSubscriber implements EventSubscriberInterface
{
public static function getSubscribedEvents(): array
{
return [
KernelEvents::EXCEPTION => ['onKernelException', 200],
];
}
public function onKernelException(ExceptionEvent $event): void
{
$exception = $event->getThrowable();
if (!$exception instanceof UnexpectedValueException || !$this->isFromSortableWalker($exception)) {
return;
}
$request = $event->getRequest();
$query = $request->query->all();
unset($query['sort'], $query['direction']);
$event->setResponse(new RedirectResponse(
$request->getPathInfo() . ($query ? '?' . http_build_query($query) : '')
));
$event->stopPropagation();
}
private function isFromSortableWalker(UnexpectedValueException $exception): bool
{
foreach ($exception->getTrace() as $frame) {
if (($frame['class'] ?? null) === OrderByWalker::class) {
return true;
}
}
return false;
}
}