src/WsProxy/Subscriber/SoapClientEventLogSubscriber.php line 76

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