src/EventListener/ExceptionListener.php line 37

Open in your IDE?
  1. <?php
  2. namespace App\EventListener;
  3. use App\Entity\Generic\User;
  4. use App\Service\Util\Telegram;
  5. use Symfony\Component\HttpKernel\Event\ExceptionEvent;
  6. use Symfony\Component\HttpFoundation\Response;
  7. use Symfony\Component\HttpKernel\Exception\HttpExceptionInterface;
  8. use Symfony\Component\HttpKernel\KernelEvents;
  9. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  10. use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
  11. use Twig\Environment;
  12. class ExceptionListener implements EventSubscriberInterface
  13. {
  14.     private Telegram $telegram;
  15.     private Environment $twig;
  16.     private $tokenStorage;
  17.     public function __construct(Telegram $telegramEnvironment $twig,TokenStorageInterface $tokenStorage)
  18.     {
  19.         $this->telegram $telegram;
  20.         $this->twig $twig;
  21.         $this->tokenStorage $tokenStorage;
  22.     }
  23.     public static function getSubscribedEvents()
  24.     {
  25.         return [
  26.             KernelEvents::EXCEPTION => 'onKernelException',
  27.         ];
  28.     }
  29.     public function onKernelException(ExceptionEvent $event)
  30.     {
  31.         $token $this->tokenStorage->getToken();
  32.         $exception $event->getThrowable();
  33.         $request $event->getRequest();
  34.         $url $request->getUri();
  35.         $statusCode $exception instanceof HttpExceptionInterface
  36.             $exception->getStatusCode()
  37.             : Response::HTTP_INTERNAL_SERVER_ERROR;
  38.         if ($statusCode !== 404) {
  39.             if ($token && $token->getUser() && is_object($token->getUser())) {
  40.                 $user $token->getUser();
  41.                 if (method_exists($user'getRoles') && in_array('ROLE_ADMIN'$user->getRoles())) {
  42.                     // برای ادمین کاری نکن، بگذار Symfony خودش خطا رو هندل کنه
  43.                     return;
  44.                 }
  45.             } else {
  46.                 try {
  47.                     $this->telegram->exception($exception$url);
  48.                 } catch (\Exception $e) {
  49.                     // نادیده بگیر
  50.                 }
  51.             }
  52.         }
  53.         // برای کاربر عادی: صفحه خطای سفارشی رو نشون بده
  54.         $template sprintf('bundles/TwigBundle/Exception/error%s.html.twig'$statusCode);
  55.         $responseContent $this->twig->render($template, [
  56.             'exception' => $exception,
  57.         ]);
  58.         $response = new Response($responseContent$statusCode);
  59.         $event->setResponse($response);
  60.     }
  61. }