src/WsProxy/Subscriber/SoapClientEventLogSubscriber.php line 59

Open in your IDE?
  1. <?php
  2. namespace App\WsProxy\Subscriber;
  3. use App\Service\Context\ContextInterface;
  4. use App\Service\Request\Context;
  5. use App\Ws\SoapClient\Transport;
  6. use Phpro\SoapClient\Event\FaultEvent;
  7. use Phpro\SoapClient\Event\RequestEvent;
  8. use Phpro\SoapClient\Event\ResponseEvent;
  9. use Psr\Log\LoggerInterface;
  10. use Soap\ExtSoapEngine\Transport\TraceableTransport;
  11. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  12. use Phpro\SoapClient\Event;
  13. class SoapClientEventLogSubscriber implements EventSubscriberInterface
  14. {
  15.     private array $methods = ['AddItem','AddOrModifyTicket''BasketMarketingAgreements''BasketOnLinePayment',
  16.         'CancelBasket''OpenReservation''UpdateReservationSeats''ConfirmReservation''CancelReservation',
  17.         'AddReservationToBasketByNumber''CloseBasket''DeleteBasketItem''MarkAsFiscalized''OpenBasket',
  18.         'UpdateBasketClient''UpdateTicketInfoRaw''UseExternalPayment''UseInternalPaymentCard''UsePaymentProvider',
  19.         'RegisterAccount''RefundTransaction''CanBeRefunded'''
  20.     ];
  21.     protected Transport $transport;
  22.     public function __construct(
  23.         private readonly LoggerInterface $soapLogger,
  24.         private readonly Context $context
  25.     )
  26.     {
  27.         $this->transport = new Transport();
  28.     }
  29.     /**
  30.      * {@inheritdoc}
  31.      */
  32.     public static function getSubscribedEvents(): array
  33.     {
  34.         return [
  35.             //RequestEvent::class => 'onClientRequest',
  36.             ResponseEvent::class => 'onClientResponse',
  37.             FaultEvent::class => 'onClientFault'
  38.         ];
  39.     }
  40.     public function onClientRequest(Event\RequestEvent $event): void
  41.     {
  42.         if ($this->isMethodToLog($event->getMethod())) {
  43.             $debug $event->getRequest();//$event->getClient()->debugLastSoapRequest();
  44.             $this->soapLogger->error(sprintf(
  45.                 '[phpro/soap-client] Request for method "%s" with data %s',
  46.                 $event->getMethod(),
  47.                 print_r($debugtrue)
  48.             ));
  49.         }
  50.     }
  51.     public function onClientResponse(Event\ResponseEvent $event): void
  52.     {
  53.         if ($this->isMethodToLog($event->getRequestEvent()->getMethod())) {
  54.             $debug $this->createDebug($event);
  55.             $this->soapLogger->info(sprintf(
  56.                 'Method "%s" with [REQUEST HEADERS] : %s, [REQUEST BODY] : %s, [RESPONSE HEADERS] %s, [RESPONSE BODY] %s [REQUEST_ID] %s [CORRELATION_ID] %s',
  57.                 $event->getRequestEvent()->getMethod(),
  58.                 print_r($debug['requestHeaders'],true),
  59.                 print_r($debug['requestBody'],true),
  60.                 print_r($debug['responseHeaders'],true),
  61.                 print_r($debug['responseBody'],true),
  62.                 $this->context->getRequestId()?->toString() ?? '',
  63.                 $this->context->getCorrelationId()?->toString() ?? ''
  64.             ));
  65.         }
  66.     }
  67.     public function onClientFault(Event\FaultEvent $event): void
  68.     {
  69.         $debug $this->createDebug($event);
  70.         $this->soapLogger->error(sprintf(
  71.             '[phpro/soap-client] fault "%s" for request "%s" with data %s',
  72.             $event->getSoapException()->getMessage(),
  73.             $event->getRequestEvent()->getMethod(),
  74.             print_r($debugtrue)
  75.         ));
  76.     }
  77.     public function getSubscribedMethods(): array
  78.     {
  79.         return $this->methods;
  80.     }
  81.     private function isMethodToLog(string $method): bool
  82.     {
  83.         return in_array($method$this->methods);
  84.     }
  85.     public function setTransport(string $factoryClassTraceableTransport $transport): SoapClientEventLogSubscriber
  86.     {
  87.         $this->transport->setTransport($this->transport->getClient($factoryClass), $transport);
  88.         return $this;
  89.     }
  90.     public function createDebug($event): array
  91.     {
  92.         $transport $this->transport->getTransport($this->transport->getClient(get_class($event->getRequestEvent()->getRequest())));
  93.         $debug = [];
  94.         if($transport instanceof TraceableTransport) {
  95.             $lastRequestCollection $transport->collectLastRequestInfo();
  96.             $debug['requestBody'] = $lastRequestCollection->getLastRequest();
  97.             $debug['requestHeaders'] = $lastRequestCollection->getLastRequestHeaders();
  98.             $debug['responseBody'] = $lastRequestCollection->getLastResponse();
  99.             $debug['responseHeaders'] = $lastRequestCollection->getLastResponseHeaders();
  100.         }
  101.         return $debug;
  102.     }
  103. }