PHP SoapParam / SoapVar для сложного типа дает «объект не имеет свойства 'xxx'» - повторяющийся элемент

Этот вопрос относится к использованию SoapParam и SoapVar в клиенте PHP SOAP для обработки повторяющихся элементов, когда запросы не могут быть представлены в виде ассоциативных массивов. В частности, он решает проблему использования SoapParam / SoapVar для сложных элементов.

У меня есть рабочий код, который я пытаюсь изменить, чтобы разрешить повторение элемента в запросе SOAP.

Рабочий код выглядит следующим образом и правильно возвращает детали одного consignmentID.

$oClient = new SoapClient($wsdlFilespec, $arguments);
$parameters = array(
   'header' => array(
      'source' => $_POST['source'],
      'accountNo' => $_POST['accountNo'],
      'userAccessKey' => $connection['userAccessKey']
      ),
   'consignmentId' => $_POST['consignmentId']
     );
$request = array('parameters' => $parameters);
$result = $oClient->__soapCall($operation, $request);

Теперь мне нужно иметь возможность передавать несколько consignmentIds, и очевидно, что ассоциативный массив для этого не работает. Итак, я пытался использовать SoapParam и SoapVar; кстати, не нашел много документации или примеров для них.

Я пробовал следующее:

$header = array(
   new SoapParam((string)$_POST['source'], 'source'), 
   new SoapParam((int)$_POST['accountNo'], 'accountNo'),
   new SoapParam((string)$connection['userAccessKey'], 'userAccessKey')
  );

$parameters = array(
   new SoapParam($header, 'header'),
   new SoapParam((string)'PDH44109', 'consignmentId'),
   new SoapParam((string)'PDH44110', 'consignmentId')
     );
$request = array('parameters' => $parameters);

Это дает: SOAP-ERROR: Encoding: объект не имеет свойства 'header'.

У меня также есть попытался использовать SoapVar в надежде заставить сложный тип «заголовка», как показано ниже:

$header = array(
  new SoapParam((string)$_POST['source'], 'source'), 
  new SoapParam((int)$_POST['accountNo'], 'accountNo'),
  new SoapParam((string)$connection['userAccessKey'], 'userAccessKey')
  );
$headerVar = new SoapVar($header, SOAP_ENC_OBJECT, 'TransactionHeaderType',     
"http://myexpress/Common/actions/externals/Consignment/v1");

$parameters = array(
           new SoapParam($headerVar, 'header'),
   new SoapParam((string)'PDH44109', 'consignmentId'),
   new SoapParam((string)'PDH44110', 'consignmentId')
     );
$request = array('parameters' => $parameters);

Это также дает: SOAP-ОШИБКА: Кодировка: объект не имеет свойства «заголовок».

Я также пробовал различные варианты последняя строка кода, например:

$request = array('parameters' => $parameters);
$request = array($parameters);
$request = $parameters;

В качестве эксперимента я временно присвоил строку $ header, а затем смог взглянуть на XML, сгенерированный __soapCall перед вызовом __doRequest, и обнаружил, что он содержит следующее:

<SOAPENV:Body><ns1:getConsignmentDetailRequest/>
<consignmentId>PDH44109</consignmentId><consignmentId>PDH44110</consignmentId>
</SOAP-ENV:Body>

Вы можете видеть, что несколько партий были отправлены правильно включен - эта часть кажется решенной - но «заголовок» (сложный тип) полностью опущен.

Буду очень признателен за любую помощь! Я настоящий новичок и потратил на это не один день. Я не уверен, например, в SoapVar, каковы подходящие параметры.

Возможно, есть проблема с вводом «заголовка»? Ниже для справки предоставлены некоторые выдержки из wsdl.

------

<wsdl:definitions xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:tns="http://my.com.au/ESB/Services/Concrete/External/Services/v1" 

xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:ns0="http://myexpress/Common/actions/externals/Consignment/v1" 

xmlns:ns1="http://myexpress/Common/externals/Faultv1" xmlns:ns2="http://myexpress/Common/actions/externals/FreightCalculation/v1" 

xmlns:ns3="http://myexpress/Common/Primitives/v1" xmlns:ns4="http://myexpress/Common/FreightProcessing/v1" 

xmlns:ns5="http://myexpress/Common/Account/v1" xmlns:ns6="http://myexpress/Common/Imaging/v1" name="Untitled" 

targetNamespace="http://my.com.au/ESB/Services/Concrete/External/Services/v1">

------

        <xsd:schema xmlns="http://myexpress/Common/Primitives/v1" xmlns:xsd="http://www.w3.org/2001/XMLSchema" 

xmlns:acc="http://myexpress/Common/Account/v1" targetNamespace="http://myexpress/Common/Primitives/v1" elementFormDefault="qualified" 

attributeFormDefault="unqualified">
            <xsd:import namespace="http://myexpress/Common/Account/v1"/>
   .
   .
   .
   .

           <xsd:complexType name="TransactionHeaderType">
                <xsd:sequence>
                    <xsd:element name="source" type="xsd:string"/>
                    <xsd:element name="accountNo" type="xsd:integer"/>
                    <xsd:element name="userAccessKey" type="xsd:string"/>
                    <xsd:element name="userId" type="ns3:userIdType" minOccurs="0"/>
                    <xsd:element name="transactionId" type="ns3:transactionIdType" minOccurs="0"/>
                    <xsd:element name="transactionDatetime" type="xsd:dateTime" minOccurs="0"/>
                </xsd:sequence>
            </xsd:complexType>

------

            <xsd:simpleType name="consignmentIdType">
                <xsd:restriction base="xsd:string">
                    <xsd:maxLength value="30"/>
                </xsd:restriction>
            </xsd:simpleType>

------

            <xsd:element name="getConsignmentDetailRequest">
                <xsd:complexType>
                    <xsd:sequence>
                        <xsd:element name="header" type="prim:TransactionHeaderType"/>
                        <xsd:element name="consignmentId" type="ns0:consignmentIdType" maxOccurs="unbounded"/>
                    </xsd:sequence>
                </xsd:complexType>
            </xsd:element>

------
5
задан BillF 12 January 2011 в 09:16
поделиться