La mapping dei tipi di PHP SoapClient si comport diversamente

Ho una function di servizio web che sta restituendo una serie di elementi a un client PHP. A seconda del numero di elementi, il tipo di reso PHP è diverso. Se la function restituisce un elemento il tipo PHP è stdClass se la function restituisce più di un elemento, il tipo PHP è arrays . In entrambi i casi dovrebbe essere arrays . Cosa posso fare per raggiungere questo objective?

Dettagli:

Un var_dump del risultato della function del servizio Web è simile al seguente:

  • se un elemento è nel risultato:
    arrays(3) { ["filterErg"]=> object(stdClass)#37 (1) { ["item"]=> object(stdClass)#38 (9) ...
  • se più di un articolo è nel risultato:
    arrays(3) { ["filterErg"]=> object(stdClass)#37 (1) { ["item"]=> arrays(16) ...

Il nome della function è getFilter e le parti rilevanti del file WSDL sono:

 <types> <schema ...> <complexType name="arraysFilter"> <sequence> <element name="item" type="ns1:stFilter" minOccurs="0" maxOccurs="unbounded" nillable="true"/> </sequence> </complexType> ... </schema> </types> <message name="getFilterResponse"> <part name="filterErg" type="ns1:arraysFilter"/> <part name="functionResult" type="xsd:int"/> <part name="outErr" type="xsd:string"/> </message> <portType name="ADServicePortType"> <operation name="getFilter"> <documentation>Service definition of function ns1__getFilter</documentation> <input message="tns:getFilter"/> <output message="tns:getFilterResponse"/> </operation> ... </portType> <binding name="ADService" type="tns:ADServicePortType"> <SOAP:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http"/> <operation name="getFilter"> <SOAP:operation style="rpc" soapAction=""/> <input> <SOAP:body use="encoded" namespace="urn:ADService" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/> </input> <output> <SOAP:body use="encoded" namespace="urn:ADService" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/> </output> </operation> ... </binding> 

Cambia la variabile da object a una matrix contenente l'object in occasione:

 if (is_object($variable)) { $variable = arrays($variable); } 

O più specificamente nel tuo caso:

 if (is_object($result["filterErg"]->item)) { $result["filterErg"]->item = arrays($result["filterErg"]->item); } 

È ansible utilizzare l'opzione SOAP_SINGLE_ELEMENT_ARRAYS durante la creazione di SoapClient

 $soapConfig = arrays( 'soap_version' => SOAP_1_2, 'features' => SOAP_SINGLE_ELEMENT_ARRAYS, 'trace' => true ); $client = new SoapClient('http://localhost:8070/Services.wsdl', $soapConfig);