src/EventSubscriber/ErrorSubscriber.php line 71

Open in your IDE?
  1. <?php declare(strict_types=1);
  2. namespace App\EventSubscriber;
  3. use App\Service\SiteManager;
  4. use Symfony\Component\Mime\Email;
  5. use App\Repository\PageRepository;
  6. use App\Repository\UserRepository;
  7. use Symfony\Component\Mime\Address;
  8. use Symfony\Bridge\Twig\Mime\TemplatedEmail;
  9. use Symfony\Component\Mailer\MailerInterface;
  10. use Symfony\Component\HttpFoundation\Response;
  11. use Symfony\Component\HttpKernel\KernelEvents;
  12. use Symfony\Component\HttpFoundation\RequestStack;
  13. use Symfony\Component\HttpKernel\Event\ExceptionEvent;
  14. use Symfony\Component\ErrorHandler\Exception\FlattenException;
  15. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  16. use Symfony\Component\Messenger\Event\WorkerMessageFailedEvent;
  17. use Symfony\Component\DependencyInjection\ParameterBag\ContainerBagInterface;
  18. class ErrorSubscriber implements EventSubscriberInterface
  19. {
  20.     private $params;
  21.     private $mailer;
  22.     private $userRepository;
  23.     private $pageRepository;
  24.     private $siteManager;
  25.     private $request;
  26.     /**
  27.      * Constructor.
  28.      */
  29.     public function __construct(ContainerBagInterface $paramsMailerInterface $mailerUserRepository $userRepositoryPageRepository $pageRepositorySiteManager $siteManagerRequestStack $requestStack)
  30.     {
  31.         $this->params $params;
  32.         $this->mailer $mailer;
  33.         $this->userRepository $userRepository;
  34.         $this->pageRepository $pageRepository;
  35.         $this->siteManager $siteManager;
  36.         $this->request $requestStack->getCurrentRequest();
  37.     }
  38.     public static function getSubscribedEvents(): array
  39.     {
  40.         return [
  41.             // Needs to be triggered after Symfony\Component\Security\Http\Firewall\ExceptionListener::onKernelException()
  42.             KernelEvents::EXCEPTION => ['onInternalServerError', -1],
  43.             WorkerMessageFailedEvent::class => ['onMessageFailed'],
  44.         ];
  45.     }
  46.     /**
  47.      * Gets an array of Super Admin addresses.
  48.      */
  49.     private function getSuperAdminAddresses(): ?array {
  50.         if (!$superAdmins $this->userRepository->findByRole('ROLE_SUPER_ADMIN')) {
  51.             return null;
  52.         }
  53.         $recipients = [];
  54.         foreach ($superAdmins as $superAdmin) {
  55.             $recipients[] = new Address($superAdmin->getEmail(), $superAdmin->getFullName());
  56.         }
  57.         return $recipients;
  58.     }
  59.     /**
  60.      * Sends email to Super Admins on HTTP internal server error (500).
  61.      */
  62.     public function onInternalServerError(ExceptionEvent $event): void
  63.     {
  64.         if (
  65.             'dev' == $this->params->get('env')
  66.             || !$recipients $this->getSuperAdminAddresses()
  67.         ) {
  68.             return;
  69.         }
  70.         $e FlattenException::createFromThrowable($event->getThrowable());
  71.         if ($e->getStatusCode() == Response::HTTP_INTERNAL_SERVER_ERROR) {
  72.             // Find the current site page.
  73.             $page $this->pageRepository->findOneBy([
  74.                 'site' => $this->siteManager->getCurrent(),
  75.                 'pathAlias' => $this->request->getPathInfo(),
  76.             ]);
  77.             $test_subject 'test' == $this->params->get('env') ? 'MAIL DE TEST ' '';
  78.             // To change default sender, @see config/packages/mailer.yaml
  79.             $mail = (new TemplatedEmail())
  80.                 ->subject($test_subject.'Chordflow : Erreur 500')
  81.                 ->to(...$recipients)
  82.                 ->htmlTemplate('email/error.html.twig')
  83.                 ->context([
  84.                     'error' => $e,
  85.                     'page' => $page,
  86.                 ]);
  87.             $this->mailer->send($mail);
  88.         }
  89.     }
  90.     /**
  91.      * Sends email to Super Admins on message failed.
  92.      */
  93.     public function onMessageFailed(WorkerMessageFailedEvent $event): void
  94.     {
  95.         if (
  96.             'dev' == $this->params->get('env')
  97.             || $event->willRetry()
  98.             || !$recipients $this->getSuperAdminAddresses()
  99.         ) {
  100.             return;
  101.         }
  102.         $message get_class($event->getEnvelope()->getMessage());
  103.         $trace $event->getThrowable()->getTraceAsString();
  104.         $test_subject 'test' == $this->params->get('env') ? 'MAIL DE TEST ' '';
  105.         // To change default sender, @see config/packages/mailer.yaml
  106.         $mail = (new Email())
  107.             ->subject($test_subject.'Chordflow : Erreur lors d\'une tâche Messenger')
  108.             ->to(...$recipients)
  109.             ->text(<<<TEXT
  110.             Une erreur est servenue lors du traitement d'une tâche Messenger dans : {$message}
  111.             Message d'erreur détaillé :
  112.             {$trace}
  113.             TEXT);
  114.         $this->mailer->send($mail);
  115.     }
  116. }