<?php
namespace App\EventListener;
use App\Entity\Generic\User;
use App\Service\Util\Telegram;
use Symfony\Component\HttpKernel\Event\ExceptionEvent;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpKernel\Exception\HttpExceptionInterface;
use Symfony\Component\HttpKernel\KernelEvents;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
use Twig\Environment;
class ExceptionListener implements EventSubscriberInterface
{
private Telegram $telegram;
private Environment $twig;
private $tokenStorage;
public function __construct(Telegram $telegram, Environment $twig,TokenStorageInterface $tokenStorage)
{
$this->telegram = $telegram;
$this->twig = $twig;
$this->tokenStorage = $tokenStorage;
}
public static function getSubscribedEvents()
{
return [
KernelEvents::EXCEPTION => 'onKernelException',
];
}
public function onKernelException(ExceptionEvent $event)
{
$token = $this->tokenStorage->getToken();
$exception = $event->getThrowable();
$request = $event->getRequest();
$url = $request->getUri();
$statusCode = $exception instanceof HttpExceptionInterface
? $exception->getStatusCode()
: Response::HTTP_INTERNAL_SERVER_ERROR;
if ($statusCode !== 404) {
if ($token && $token->getUser() && is_object($token->getUser())) {
$user = $token->getUser();
if (method_exists($user, 'getRoles') && in_array('ROLE_ADMIN', $user->getRoles())) {
// برای ادمین کاری نکن، بگذار Symfony خودش خطا رو هندل کنه
return;
}
} else {
try {
$this->telegram->exception($exception, $url);
} catch (\Exception $e) {
// نادیده بگیر
}
}
}
// برای کاربر عادی: صفحه خطای سفارشی رو نشون بده
$template = sprintf('bundles/TwigBundle/Exception/error%s.html.twig', $statusCode);
$responseContent = $this->twig->render($template, [
'exception' => $exception,
]);
$response = new Response($responseContent, $statusCode);
$event->setResponse($response);
}
}