<?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;
}
}