src/InsuranceCompany/Bulstrad/SOAP/Subscriber/ErrorHandlingSubscriber.php line 22

Open in your IDE?
  1. <?php
  2. namespace App\InsuranceCompany\Bulstrad\SOAP\Subscriber;
  3. use App\InsuranceCompany\Bulstrad\Exception\Exception;
  4. use App\InsuranceCompany\Bulstrad\SOAP\Interfaces\ResponseInterface;
  5. use App\InsuranceCompany\Bulstrad\SOAP\Interfaces\StatusMessageTypeInterface;
  6. use Phpro\SoapClient\Event\ResponseEvent;
  7. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  8. use UnexpectedValueException;
  9. /**
  10.  * Class ErrorHandlingSubscriber
  11.  */
  12. class ErrorHandlingSubscriber implements EventSubscriberInterface
  13. {
  14.     /**
  15.      * @param ResponseEvent $event
  16.      * @throws Exception
  17.      */
  18.     public function onClientResponse(ResponseEvent $event)
  19.     {
  20.         $response $event->getResponse();
  21.         if (!($response instanceof ResponseInterface)) {
  22.             throw new UnexpectedValueException('Response type is not a ResponseInterface');
  23.         }
  24.         $status $response->getStatus();
  25.         $result $status->getResult();
  26.         if ($result === 0) {
  27.             return;
  28.         }
  29.         /**
  30.          * @var StatusMessageTypeInterface[] $messages
  31.          */
  32.         $messages $status->getMessages()->getMessage();
  33.         $errorMessage implode('; 'array_map(function(StatusMessageTypeInterface $message) {
  34.             return $message->getCode() . ': ' $message->getDescription();
  35.         }, $messages));
  36.         $exception = new Exception(
  37.             message$errorMessage,
  38.             code$result,
  39.             messages$messages,
  40.         );
  41.         $internalServerError $exception->getMessageByCode('OSB-380001');
  42.         if ($internalServerError?->getDescription() === 'Internal Server Error') {
  43.             $exception = new Exception(
  44.                 message'Проблем при комуникацията със застрахователна компания Булстрад',
  45.                 code$result,
  46.                 messages$messages,
  47.             );
  48.         }
  49.         $loginError $exception->getMessageByCode('SOA_ERROR');
  50.         if (str_contains($loginError?->getDescription() ?? '''WEB.COMMON.LOGIN.NO_SUCH_USER')) {
  51.             $exception = new Exception(
  52.                 message'В момента няма достъп до застрахователна компания Булстрад',
  53.                 code$result,
  54.                 messages$messages,
  55.             );
  56.         }
  57.         throw $exception;
  58.     }
  59.     /**
  60.      * {@inheritdoc}
  61.      * @noinspection PhpArrayShapeAttributeCanBeAddedInspection
  62.      */
  63.     public static function getSubscribedEvents(): array
  64.     {
  65.         return [
  66.             ResponseEvent::class => 'onClientResponse',
  67.         ];
  68.     }
  69. }