<?php
namespace App\WsProxy\Subscriber;
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 LoggerInterface $soapLogger;
private array $methods = ['AddBillItem', 'AddItem','AddOrModifyTicket', 'AddTicket', 'BasketMarketingAgreements', 'BasketOnLinePayment', 'BatchVoucherLock',
'CalculateOrderByPromotion', 'CalculatePriceByVoucher', 'CancelBasket', 'CancelReservation', 'CancelReservationByToken',
'CloseBasket', 'CloseBill', 'DeleteBasketItem', 'LockPlaces', 'LockPlacesExt', 'LockSeatExt',
'LockSeatList', 'MarkAsFiscalized', 'ModifyTicket', 'OpenBasket', 'OpenBill', 'SavePaymentProcesStatus', 'SetBasketPayment', 'UpdateBasketClient',
'UpdateClientReservation', 'UpdateTicketInfo', 'UpdateTicketInfoRaw', 'UpdateTicketList', 'UseExternalPayment', 'UseInternalPaymentCard', 'UsePaymentProvider',
'RegisterAccount', 'RefundTransaction', 'CanBeRefunded'
];
protected Transport $transport;
public function __construct(LoggerInterface $soapLogger)
{
$this->transport = new Transport();
$this->soapLogger = $soapLogger;
}
/**
* {@inheritdoc}
*/
public static function getSubscribedEvents(): array
{
return [
//RequestEvent::class => 'onClientRequest',
ResponseEvent::class => 'onClientResponse',
FaultEvent::class => 'onClientFault'
];
}
public function onClientRequest(Event\RequestEvent $event)
{
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)
{
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',
$event->getRequestEvent()->getMethod(),
print_r($debug['requestHeaders'],true),
print_r($debug['requestBody'],true),
print_r($debug['responseHeaders'],true),
print_r($debug['responseBody'],true),
));
}
}
public function onClientFault(Event\FaultEvent $event)
{
$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;
}
}