PHP SoapClient тип отображения ведет себя по-разному - PullRequest
4 голосов
/ 20 июня 2011

У меня есть функция веб-сервиса, которая возвращает массив элементов в PHP-клиент.В зависимости от количества элементов, тип возврата PHP может быть различным.Если функция возвращает один элемент, тип PHP равен stdClass, если функция возвращает более одного элемента, тип PHP равен array.В любом случае это должно быть array.Что я могу сделать для этого?

Подробности:

A var_dump результата от функции веб-службы выглядит следующим образом:
  • еслиТовар находится в результате:array(3) { ["filterErg"]=> object(stdClass)#37 (1) { ["item"]=> object(stdClass)#38 (9) ...
  • , если в результате более одного элемента:array(3) { ["filterErg"]=> object(stdClass)#37 (1) { ["item"]=> array(16) ...

Имя функции getFilter и соответствующие части файла WSDL:

<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>

Ответы [ 2 ]

7 голосов
/ 04 ноября 2011

Вы можете использовать опцию SOAP_SINGLE_ELEMENT_ARRAYS при создании SoapClient

$soapConfig = array(
    'soap_version' => SOAP_1_2,
    'features' => SOAP_SINGLE_ELEMENT_ARRAYS,
    'trace'    => true
);
$client = new SoapClient('http://localhost:8070/Services.wsdl', $soapConfig);
2 голосов
/ 20 июня 2011

Измените переменную из объекта в массив, содержащий объект, при случае:

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

Или, более конкретно, в вашем случае:

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