<?php
declare(strict_types=1);
namespace App\EventListener;
use App\Helper\StringHelper;
use Psr\Log\LoggerInterface;
use Psr\Log\LogLevel;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpKernel\Event\ExceptionEvent;
use Symfony\Contracts\Translation\TranslatorInterface;
use Twig\Environment;
class AdminExceptionListener
{
private Environment $twig;
private TranslatorInterface $translator;
private LoggerInterface $logger;
public function __construct(Environment $twig, TranslatorInterface $translator, LoggerInterface $adminLogger)
{
$this->twig = $twig;
$this->translator = $translator;
$this->logger = $adminLogger;
}
public function onKernelException(ExceptionEvent $event): void
{
if($_ENV['APP_ENV'] == 'dev')
return;
$this->logger->log(LogLevel::ERROR, $event->getException()->getMessage());
$url = $event->getRequest()->getPathInfo();
if (!StringHelper::startsWith($url, '/admin')) {
return;
}
$code = $event->getException()->getCode() === 0 ? Response::HTTP_INTERNAL_SERVER_ERROR : $event->getException()->getCode();
$event->setResponse((new Response())->setContent($this->twig->render('admin/error.html.twig', [
'message' => $this->translator->trans(Response::$statusTexts[$code], [], 'http')
])));
}
}