example - La asignación de tipos de PHP SoapClient se comporta de manera diferente
soap 1.2 php (2)
Cambia la variable de objeto a una matriz que contiene el objeto en alguna ocasión:
if (is_object($variable))
{
$variable = array($variable);
}
O más específicamente en tu caso:
if (is_object($result["filterErg"]->item))
{
$result["filterErg"]->item = array($result["filterErg"]->item);
}
Tengo una función de servicio web que devuelve una serie de elementos a un cliente PHP. Dependiendo de la cantidad de elementos, el tipo de devolución de PHP es diferente. Si la función devuelve un elemento, el tipo de PHP es stdClass
si la función devuelve más de un elemento, el tipo de PHP es una array
. En cualquier caso, debería ser una array
. ¿Qué puedo hacer para lograr esto?
Detalles:
Unvar_dump
del resultado de la función del servicio web tiene el siguiente aspecto: - si un elemento está en el resultado:
array(3) { ["filterErg"]=> object(stdClass)#37 (1) { ["item"]=> object(stdClass)#38 (9) ...
- si hay más de un elemento en el resultado:
array(3) { ["filterErg"]=> object(stdClass)#37 (1) { ["item"]=> array(16) ...
El nombre de la función es getFilter
y las partes relevantes del archivo WSDL son:
<types>
<schema ...>
<complexType name="arrayFilter">
<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:arrayFilter"/>
<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>
Puede usar la opción SOAP_SINGLE_ELEMENT_ARRAYS cuando está creando SoapClient
$soapConfig = array(
''soap_version'' => SOAP_1_2,
''features'' => SOAP_SINGLE_ELEMENT_ARRAYS,
''trace'' => true
);
$client = new SoapClient(''http://localhost:8070/Services.wsdl'', $soapConfig);