<?php
// src/EventSubscriber/ExceptionSubscriber.php
namespace App\EventSubscriber;
use Twig\Environment;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpKernel\KernelEvents;
use Symfony\Component\HttpKernel\Event\ExceptionEvent;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpKernel\Exception\HttpExceptionInterface;
class ExceptionSubscriber implements EventSubscriberInterface
{
public function __construct(
private Environment $twig,
) {
}
public static function getSubscribedEvents(): array
{
// return the subscribed events, their methods and priorities
return [
KernelEvents::EXCEPTION => [
['processException', 10],
['logException', 0],
['notifyException', -10],
],
];
}
public function processException(ExceptionEvent $event): void
{
$exception = $event->getThrowable();
if ($exception->getLine() != 500 && $exception->getCode() != 404) {
return;
}
$message = sprintf(
'Error %s. Message: %s',
$exception->getCode(),
$exception->getMessage()
);
$response = new Response();
$response->headers->set('Content-Type', 'text/html; charset=utf-8');
$status_code = $exception->getCode();
if ($exception instanceof HttpExceptionInterface) {
$status_code = $exception->getStatusCode();
if ($status_code == 404) {
$message = "Page not Found";
}
$response->setStatusCode($exception->getStatusCode());
$response->headers->replace($exception->getHeaders());
} else {
$status_code = 500;
$response->setStatusCode(500);
}
if ($status_code == 404) {
$content = $this->twig->render('error/error404.html.twig', [
'exception' => $exception,
'code' => $status_code,
'status_code' => $status_code,
'message' => $message,
]);
} else {
$content = $exception->getTraceAsString();
// $this->twig->render('error/error.html.twig', [
// 'exception' => $exception,
// 'code' => $status_code,
// 'status_code' => $status_code,
// 'message' => $message,
// ]);
}
$response->setContent($content);
$event->setResponse($response);
}
public function logException(ExceptionEvent $event): void
{
// ...
}
public function notifyException(ExceptionEvent $event): void
{
// ...
}
}