- <?php
- namespace App\WsProxy\Subscriber;
- use App\Service\Context\ContextInterface;
- use App\Service\Request\Context;
- use App\Ws\SoapClient\Transport;
- use Phpro\SoapClient\Event\FaultEvent;
- use Phpro\SoapClient\Event\RequestEvent;
- use Phpro\SoapClient\Event\ResponseEvent;
- use Psr\Log\LoggerInterface;
- use Soap\ExtSoapEngine\Transport\TraceableTransport;
- use Symfony\Component\EventDispatcher\EventSubscriberInterface;
- use Phpro\SoapClient\Event;
- class SoapClientEventLogSubscriber implements EventSubscriberInterface
- {
-     private array $methods = ['AddItem','AddOrModifyTicket', 'BasketMarketingAgreements', 'BasketOnLinePayment',
-         'CancelBasket', 'OpenReservation', 'UpdateReservationSeats', 'ConfirmReservation', 'CancelReservation',
-         'AddReservationToBasketByNumber', 'CloseBasket', 'DeleteBasketItem', 'MarkAsFiscalized', 'OpenBasket',
-         'UpdateBasketClient', 'UpdateTicketInfoRaw', 'UseExternalPayment', 'UseInternalPaymentCard', 'UsePaymentProvider',
-         'RegisterAccount', 'RefundTransaction', 'CanBeRefunded', ''
-     ];
-     protected Transport $transport;
-     public function __construct(
-         private readonly LoggerInterface $soapLogger,
-         private readonly Context $context
-     )
-     {
-         $this->transport = new Transport();
-     }
-     /**
-      * {@inheritdoc}
-      */
-     public static function getSubscribedEvents(): array
-     {
-         return [
-             //RequestEvent::class => 'onClientRequest',
-             ResponseEvent::class => 'onClientResponse',
-             FaultEvent::class => 'onClientFault'
-         ];
-     }
-     public function onClientRequest(Event\RequestEvent $event): void
-     {
-         if ($this->isMethodToLog($event->getMethod())) {
-             $debug = $event->getRequest();//$event->getClient()->debugLastSoapRequest();
-             $this->soapLogger->error(sprintf(
-                 '[phpro/soap-client] Request for method "%s" with data %s',
-                 $event->getMethod(),
-                 print_r($debug, true)
-             ));
-         }
-     }
-     public function onClientResponse(Event\ResponseEvent $event): void
-     {
-         if ($this->isMethodToLog($event->getRequestEvent()->getMethod())) {
-             $debug = $this->createDebug($event);
-             $this->soapLogger->info(sprintf(
-                 'Method "%s" with [REQUEST HEADERS] : %s, [REQUEST BODY] : %s, [RESPONSE HEADERS] %s, [RESPONSE BODY] %s [REQUEST_ID] %s [CORRELATION_ID] %s',
-                 $event->getRequestEvent()->getMethod(),
-                 print_r($debug['requestHeaders'],true),
-                 print_r($debug['requestBody'],true),
-                 print_r($debug['responseHeaders'],true),
-                 print_r($debug['responseBody'],true),
-                 $this->context->getRequestId()?->toString() ?? '',
-                 $this->context->getCorrelationId()?->toString() ?? ''
-             ));
-         }
-     }
-     public function onClientFault(Event\FaultEvent $event): void
-     {
-         $debug = $this->createDebug($event);
-         $this->soapLogger->error(sprintf(
-             '[phpro/soap-client] fault "%s" for request "%s" with data %s',
-             $event->getSoapException()->getMessage(),
-             $event->getRequestEvent()->getMethod(),
-             print_r($debug, true)
-         ));
-     }
-     public function getSubscribedMethods(): array
-     {
-         return $this->methods;
-     }
-     private function isMethodToLog(string $method): bool
-     {
-         return in_array($method, $this->methods);
-     }
-     public function setTransport(string $factoryClass, TraceableTransport $transport): SoapClientEventLogSubscriber
-     {
-         $this->transport->setTransport($this->transport->getClient($factoryClass), $transport);
-         return $this;
-     }
-     public function createDebug($event): array
-     {
-         $transport = $this->transport->getTransport($this->transport->getClient(get_class($event->getRequestEvent()->getRequest())));
-         $debug = [];
-         if($transport instanceof TraceableTransport) {
-             $lastRequestCollection = $transport->collectLastRequestInfo();
-             $debug['requestBody'] = $lastRequestCollection->getLastRequest();
-             $debug['requestHeaders'] = $lastRequestCollection->getLastRequestHeaders();
-             $debug['responseBody'] = $lastRequestCollection->getLastResponse();
-             $debug['responseHeaders'] = $lastRequestCollection->getLastResponseHeaders();
-         }
-         return $debug;
-     }
- }
-