From 01d10b89fd6f2969bd18cbee579eaa8621259d63 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Petr=20Bechyn=C4=9B?= Date: Fri, 17 Feb 2017 03:19:22 +0100 Subject: [PATCH] SoapClient now handles Attachments better The inner storage is now the only possible way to handle attachments and hydrate responses by using ClassMap at the same time. To get the response objects from ClassMap, use SoapResponse->getResponseObject() method --- src/BeSimple/SoapClient/SoapClient.php | 115 +++++++++++++---------- src/BeSimple/SoapClient/SoapResponse.php | 15 +++ 2 files changed, 82 insertions(+), 48 deletions(-) diff --git a/src/BeSimple/SoapClient/SoapClient.php b/src/BeSimple/SoapClient/SoapClient.php index 3d6fe4d..6be3a3f 100644 --- a/src/BeSimple/SoapClient/SoapClient.php +++ b/src/BeSimple/SoapClient/SoapClient.php @@ -41,6 +41,10 @@ class SoapClient extends \SoapClient protected $soapClientOptions; protected $soapOptions; private $curl; + /** @var SoapAttachment[] */ + private $soapAttachmentsOnRequestStorage; + /** @var SoapResponse */ + private $soapResponseStorage; public function __construct(SoapClientOptions $soapClientOptions, SoapOptions $soapOptions) { @@ -54,7 +58,8 @@ class SoapClient extends \SoapClient $wsdlPath = $this->loadWsdl( $this->curl, $soapOptions->getWsdlFile(), - $soapOptions->getWsdlCacheType() + $soapOptions->getWsdlCacheType(), + false ); } catch (Exception $e) { throw new SoapFault( @@ -88,9 +93,9 @@ class SoapClient extends \SoapClient * @param array|null $output_headers * @return string */ - public function __soapCall($function_name, array $arguments, array $options = null, $input_headers = null, array &$output_headers = null) + public function __soapCall($function_name, $arguments, $options = null, $input_headers = null, &$output_headers = null) { - return $this->soapCall($function_name, $arguments, $options, $input_headers, $output_headers)->getContent(); + return $this->soapCall($function_name, $arguments, $options, $input_headers, $output_headers)->getResponseContent(); } /** @@ -104,17 +109,13 @@ class SoapClient extends \SoapClient */ public function soapCall($functionName, array $arguments, array $soapAttachments = [], array $options = null, $inputHeaders = null, array &$outputHeaders = null) { - ob_start(); - parent::__soapCall($functionName, $arguments, $options, $inputHeaders, $outputHeaders); - $nativeSoapClientRequest = $this->mapNativeDataJsonToDto(ob_get_clean()); + $this->setSoapAttachmentsOnRequestToStorage($soapAttachments); + $soapResponseAsObject = parent::__soapCall($functionName, $arguments, $options, $inputHeaders, $outputHeaders); - return $this->performSoapRequest( - $nativeSoapClientRequest->request, - $nativeSoapClientRequest->location, - $nativeSoapClientRequest->action, - $nativeSoapClientRequest->version, - $soapAttachments - ); + $soapResponse = $this->getSoapResponseFromStorage(); + $soapResponse->setResponseObject($soapResponseAsObject); + + return $soapResponse; } /** @@ -130,34 +131,16 @@ class SoapClient extends \SoapClient */ public function __doRequest($request, $location, $action, $version, $oneWay = 0) { - $soapClientNativeDataTransferObject = new SoapClientNativeDataTransferObject( + $soapResponse = $this->performSoapRequest( $request, $location, $action, - $version + $version, + $this->getSoapAttachmentsOnRequestFromStorage() ); - echo json_encode($soapClientNativeDataTransferObject); + $this->setSoapResponseToStorage($soapResponse); - return $request; - } - - /** - * Custom request method to be able to modify the SOAP messages. - * $oneWay parameter is not used at the moment. - * - * @param mixed $request Request object - * @param string $location Location - * @param string $action SOAP action - * @param int $version SOAP version - * @param SoapAttachment[] $soapAttachments SOAP attachments array - * - * @return SoapResponse - */ - public function performSoapRequest($request, $location, $action, $version, array $soapAttachments = []) - { - $soapRequest = $this->createSoapRequest($location, $action, $version, $request, $soapAttachments); - - return $this->performHttpSoapRequest($soapRequest); + return $soapResponse->getResponseContent(); } /** @deprecated */ @@ -200,6 +183,25 @@ class SoapClient extends \SoapClient ); } + /** + * Custom request method to be able to modify the SOAP messages. + * $oneWay parameter is not used at the moment. + * + * @param mixed $request Request object + * @param string $location Location + * @param string $action SOAP action + * @param int $version SOAP version + * @param SoapAttachment[] $soapAttachments SOAP attachments array + * + * @return SoapResponse + */ + private function performSoapRequest($request, $location, $action, $version, array $soapAttachments = []) + { + $soapRequest = $this->createSoapRequest($location, $action, $version, $request, $soapAttachments); + + return $this->performHttpSoapRequest($soapRequest); + } + /** * @param string $location Location * @param string $action SOAP action @@ -336,18 +338,6 @@ class SoapClient extends \SoapClient return $filters; } - private function mapNativeDataJsonToDto($nativeDataJson) - { - $nativeData = json_decode($nativeDataJson); - - return new SoapClientNativeDataTransferObject( - $nativeData->request, - $nativeData->location, - $nativeData->action, - $nativeData->version - ); - } - private function returnSoapResponseByTracing( $isTracingEnabled, SoapRequest $soapRequest, @@ -405,4 +395,33 @@ class SoapClient extends \SoapClient throw new Exception('SoapClientOptions tracing disabled, turn on trace attribute'); } } + + private function setSoapResponseToStorage(SoapResponse $soapResponseStorage) + { + $this->soapResponseStorage = $soapResponseStorage; + } + + /** + * @param SoapAttachment[] $soapAttachments + */ + private function setSoapAttachmentsOnRequestToStorage(array $soapAttachments) + { + $this->soapAttachmentsOnRequestStorage = $soapAttachments; + } + + private function getSoapAttachmentsOnRequestFromStorage() + { + $soapAttachmentsOnRequest = $this->soapAttachmentsOnRequestStorage; + $this->soapAttachmentsOnRequestStorage = null; + + return $soapAttachmentsOnRequest; + } + + private function getSoapResponseFromStorage() + { + $soapResponse = $this->soapResponseStorage; + $this->soapResponseStorage = null; + + return $soapResponse; + } } diff --git a/src/BeSimple/SoapClient/SoapResponse.php b/src/BeSimple/SoapClient/SoapResponse.php index 2a0e851..3b68297 100644 --- a/src/BeSimple/SoapClient/SoapResponse.php +++ b/src/BeSimple/SoapClient/SoapResponse.php @@ -6,8 +6,23 @@ use BeSimple\SoapCommon\SoapResponse as CommonSoapResponse; class SoapResponse extends CommonSoapResponse { + /** + * @var mixed + */ + protected $responseObject; + public function getResponseContent() { return $this->getContent(); } + + public function getResponseObject() + { + return $this->responseObject; + } + + public function setResponseObject($responseObject) + { + $this->responseObject = $responseObject; + } }