src/Salesforce/EventListener/SalesForceExceptionListener.php line 45

Open in your IDE?
  1. <?php
  2. namespace App\Salesforce\EventListener;
  3. use Symfony\Component\Config\Definition\Exception\Exception;
  4. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  5. use Symfony\Component\HttpFoundation\RedirectResponse;
  6. use Symfony\Component\HttpKernel\Event\ExceptionEvent;
  7. use Symfony\Component\HttpKernel\Event\GetResponseForExceptionEvent;
  8. use Symfony\Component\HttpKernel\KernelEvents;
  9. use Symfony\Component\Routing\RouterInterface;
  10. /**
  11.  * SalesForce Event listener for the kernel exception event
  12.  * This listener is here to avoid seeing an error 500 whenever SalesForce services are unavailable.
  13.  *
  14.  * @todo As of right now, this prevents an error 500, but is not making a natural transition
  15.  * Maybe needs some error handlers or something, but it has to be reworked
  16.  *
  17.  * @author Paul Kervella <pkervella@vpauto.fr>
  18.  */
  19. class SalesForceExceptionListener implements EventSubscriberInterface
  20. {
  21.     /**
  22.      * Initialize values.
  23.      */
  24.     public function __construct(private readonly RouterInterface $router)
  25.     {
  26.     }
  27.     public static function getSubscribedEvents()
  28.     {
  29.         // The default Symfony ExceptionListener has a priority order of -128, so -127 is enough to act before it
  30.         return [
  31.             KernelEvents::EXCEPTION => [['onSoapFault', -127]],
  32.         ];
  33.     }
  34.     /**
  35.      * Exception handler for SoapFault
  36.      * This is the one thrown when an issue with SalesForce has occurred (unavailability, wrong login...).
  37.      *
  38.      * @return RedirectResponse
  39.      */
  40.     public function onSoapFault(ExceptionEvent $evt): void
  41.     {
  42.         if ('SoapFault' === $evt->getThrowable()::class) {
  43.             $rq $evt->getRequest();
  44.             if (stripos($rq->getRequestUri(), 'admin')) {
  45.                 $rq->getSession()->getFlashBag()->add('error''Une erreur s\'est produite lors de la communication avec SalesForce. Merci de contacter l\'administrateur.');
  46.                 $response = new RedirectResponse($this->router->generate('homepage'));
  47.             } elseif (stripos($rq->getRequestUri(), 'terminal')) {
  48.                 if (!empty($rq->headers->get('referer'))) {
  49.                     $response = new RedirectResponse($rq->headers->get('referer'));
  50.                 } else {
  51.                     $response = new RedirectResponse($rq->headers->get('vpauto_terminal_registration_homepage'));
  52.                 }
  53.             } else {
  54.                 $response = new RedirectResponse($this->router->generate('homepage'));
  55.             }
  56.             $evt->setResponse($response);
  57.         }
  58.     }
  59. }