Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
96.43% covered (success)
96.43%
27 / 28
66.67% covered (warning)
66.67%
2 / 3
CRAP
0.00% covered (danger)
0.00%
0 / 1
RenderErrorListener
96.43% covered (success)
96.43%
27 / 28
66.67% covered (warning)
66.67%
2 / 3
14
0.00% covered (danger)
0.00%
0 / 1
 __construct
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 getSubscribedEvents
100.00% covered (success)
100.00%
3 / 3
100.00% covered (success)
100.00%
1 / 1
1
 onKernelException
95.83% covered (success)
95.83%
23 / 24
0.00% covered (danger)
0.00%
0 / 1
12
1<?php
2namespace Apie\ApieBundle\EventListeners;
3
4use Apie\Common\ErrorHandler\ApiErrorRenderer;
5use Apie\Common\IntegrationTestLogger;
6use Apie\Core\ContextConstants;
7use Apie\Core\Exceptions\HttpStatusCodeException;
8use Apie\HtmlBuilders\ErrorHandler\CmsErrorRenderer;
9use Psr\Log\LoggerInterface;
10use Symfony\Component\EventDispatcher\EventSubscriberInterface;
11use Symfony\Component\HttpKernel\Event\ExceptionEvent;
12use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
13use Symfony\Component\HttpKernel\KernelEvents;
14
15class RenderErrorListener implements EventSubscriberInterface
16{
17    public function __construct(
18        private readonly ?CmsErrorRenderer $cmsErrorRenderer,
19        private readonly ApiErrorRenderer $apiErrorRenderer,
20        private readonly LoggerInterface $logger,
21        private readonly string $cmsBaseUrl
22    ) {
23    }
24
25    /**
26     * @return array<string, array<int, int|string>>
27     */
28    public static function getSubscribedEvents(): array
29    {
30        return [
31            KernelEvents::EXCEPTION => ['onKernelException', -1],
32        ];
33    }
34
35    public function onKernelException(ExceptionEvent $event): void
36    {
37        $this->logger->error(
38            'An error occured in Symfony: ' . $event->getThrowable()->getMessage(),
39            ['error' => $event->getThrowable()]
40        );
41        if (!$event->isMainRequest()) {
42            return;
43        }
44        $request = $event->getRequest();
45        if ($request->attributes->has('_is_apie')) {
46            if ($request->attributes->has(ContextConstants::CMS)
47                && null !== $this->cmsErrorRenderer
48                && !$event->hasResponse()
49            ) {
50                $event->setResponse($this->cmsErrorRenderer->createCmsResponse($event->getRequest(), $event->getThrowable()));
51            } else {
52                $event->setResponse($this->apiErrorRenderer->createApiResponse($event->getThrowable()));
53            }
54        }
55        $exception = $event->getThrowable();
56        IntegrationTestLogger::logException($exception);
57        if ($exception instanceof NotFoundHttpException) {
58            if (str_starts_with($request->getPathInfo(), $this->cmsBaseUrl)
59                && null !== $this->cmsErrorRenderer
60                && !$event->hasResponse()
61            ) {
62                $event->setResponse($this->cmsErrorRenderer->createCmsResponse($event->getRequest(), $event->getThrowable()));
63            }
64        }
65        if ($exception instanceof HttpStatusCodeException) {
66            $response = $event->getResponse();
67            if ($response) {
68                $response->setStatusCode($exception->getStatusCode());
69            }
70        }
71    }
72}