<?php
declare(strict_types=1);
namespace App\Subscriber;
use Monolog\Logger;
use Psr\Log\LoggerInterface;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpKernel\Event\ExceptionEvent;
use Symfony\Component\HttpKernel\KernelEvents;
use Symfony\Component\HttpKernel\KernelInterface;
final class ExceptionSubscriber implements EventSubscriberInterface
{
public function __construct(private KernelInterface $kernel, private LoggerInterface $mainLogger)
{
}
public static function getSubscribedEvents(): array
{
return [
KernelEvents::EXCEPTION => [
['processException', 0],
],
];
}
public function processException(ExceptionEvent $exceptionEvent): void
{
if ('local' === $this->kernel->getEnvironment()) {
return;
}
$throwable = $exceptionEvent->getThrowable();
$statusCodeDefault = ($throwable->getCode() >= 400) && ($throwable->getCode() < 600) ? $throwable->getCode() : Response::HTTP_BAD_REQUEST;
$exceptionEvent->setResponse(new JsonResponse([
'message' => $throwable->getMessage(),
], $statusCodeDefault));
$this->mainLogger->log(Logger::ERROR, $throwable->getMessage());
}
}