src/EventSubscriber/ExceptionSubscriber.php line 24

Open in your IDE?
  1. <?php
  2. namespace App\EventSubscriber;
  3. use App\Service\EmailService;
  4. use App\Utils\HelperUtil;
  5. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  6. use Symfony\Component\HttpFoundation\Request;
  7. use Symfony\Component\HttpKernel\Event\ExceptionEvent;
  8. use Symfony\Component\HttpKernel\KernelInterface;
  9. use Symfony\Component\Security\Core\Security;
  10. class ExceptionSubscriber implements EventSubscriberInterface
  11. {
  12.     public function __construct(
  13.         private EmailService $emailService,
  14.         private Security $security,
  15.         private HelperUtil $helper,
  16.         protected string $adminEmail,
  17.         private KernelInterface $kernel
  18.     ) {
  19.     }
  20.     public function onKernelException(ExceptionEvent $event)
  21.     {
  22.         $request $event->getRequest();
  23.         if ($event->getThrowable()) {
  24.             $environment $this->kernel->getEnvironment();
  25.             if ('dev' == $environment) {
  26.                 // En entorno de desarrollo donde puedes ver los errores y los provocan los desarrolladores no tiene tanto sentido enviar el error por correo
  27.                 return true;
  28.             }
  29.             $code 000;
  30.             $this->helper->error(null$event->getThrowable()->getMessage());
  31.             if (is_callable([$event->getThrowable(), 'getStatusCode'])) {
  32.                 if (404 == $event->getThrowable()->getStatusCode()) {
  33.                     // Por ahora solo enviariamos mail cuando son errores 500 u otros
  34.                     return true;
  35.                 }
  36.                 $code $event->getThrowable()->getStatusCode();
  37.             } elseif (is_callable([$event->getThrowable(), 'getCode'])) {
  38.                 if (404 == $event->getThrowable()->getCode()) {
  39.                     // Por ahora solo enviariamos mail cuando son errores 500 u otros
  40.                     return true;
  41.                 }
  42.                 $code $event->getThrowable()->getCode();
  43.             }
  44.             $referer $request->headers->get('referer'); // get the referer, it can be empty!
  45.             if (!\is_string($referer) || !$referer) {
  46.                 $refererPath null;
  47.             }else{
  48.                 $refererPath Request::create($referer)->getPathInfo();
  49.             }
  50.             $params = [
  51.                 'currentUrl' => $request->getUri(),
  52.                 'usuario' => $this->security->getUser(),
  53.                 'message' => $event->getThrowable()->getMessage(),
  54.                 'ip' => $request->getClientIp(),
  55.                 'refererUrl' => $refererPath
  56.             ];
  57.             if (count($request->request->all()) > 0) {
  58.                 $params['post_params'] = $request->request->all();
  59.             }
  60.             $this->emailService->envioBasico([
  61.                 'asunto' => 'Error ' $code ' detectado',
  62.                 'exception' => $event->getThrowable(),
  63.                 'plantilla' => 'emails/sistema/mail_exception.html.twig',
  64.                 'plantilla_params' => $params,
  65.                 'to' => [$this->adminEmail],
  66.             ]);
  67.         }
  68.     }
  69.     public static function getSubscribedEvents(): array
  70.     {
  71.         return [
  72.             'kernel.exception' => 'onKernelException',
  73.         ];
  74.     }
  75. }