последовательность параметров php SoapClient с тем же именем - PullRequest
0 голосов
/ 18 сентября 2018

Я должен сделать мыльный вызов, где параметр содержит последовательность сложного типа.

Я не могу найти хороший формат для параметра.

Здесь xsd:

<xs:complexType name="createOspService">
    <xs:sequence>
        <xs:element name="OSP" type="tns:OSP" minOccurs="0"/>
    </xs:sequence>
</xs:complexType>

<xs:complexType name="ospServiceResponse">
</xs:complexType>
<xs:complexType name="OSP">
    <xs:sequence>
        <xs:element name="OSP_ID" type="xs:int" minOccurs="1" maxOccurs="1"/>
        <xs:element name="DATE_OSP" type="xs:dateTime" minOccurs="1" maxOccurs="1"/>
        <xs:element name="CUSTOMER_ID" type="xs:int" minOccurs="1" maxOccurs="1"/>
        <xs:element name="RECIPIENT_ID" type="xs:int" minOccurs="1" maxOccurs="1"/>
        <xs:element name="ITEMS" type="tns:ITEMS" minOccurs="1" maxOccurs="1"/>
    </xs:sequence>
</xs:complexType>

<xs:complexType name="ITEMS">
    <xs:sequence>
        <xs:element name="ITEM" type="tns:ITEM" minOccurs="1" maxOccurs="unbounded"/>
    </xs:sequence>
</xs:complexType>

<xs:complexType name="ITEM">
    <xs:sequence>
        <xs:element name="OSP_ITEM" type="xs:string" minOccurs="1" maxOccurs="1"/>
        <xs:element name="QUANTITY" type="xs:double" minOccurs="1" maxOccurs="1"/>
        <xs:element name="UNIT_PRICE" type="xs:double" minOccurs="1" maxOccurs="1"/>
        <xs:element name="VAT_CODE" type="xs:string" minOccurs="1" maxOccurs="1"/>
    </xs:sequence>
</xs:complexType>

Вызов php:

$client = new \SoapClient('http://10.55.12.90:18180/NABSCamel/lgg/osp/ws?wsdl', $options);
try {
    $osp = new \stdClass();
    $osp->OSP = new \stdClass();
    $osp->OSP->OSP_ID = $this->meetingRoomBookingI;
    $osp->OSP->DATE_OSP = $date->format('c');
    $osp->OSP->CUSTOMER_ID = $customer->Id();
    $osp->OSP->RECIPIENT_ID = $recipientId;

    $items = [];

    $item = new \stdClass();
    $item->OSP_ITEM = 'test 1';
    $item->VAT_CODE = 21;
    $item->QUANTITY = 2;
    $item->UNIT_PRICE = 3;

    $items[] = $item;

    $item = new \stdClass();
    $item->OSP_ITEM = 'test 2';
    $item->VAT_CODE = 21;
    $item->QUANTITY = 2;
    $item->UNIT_PRICE = 3;

    $items[] = $item;

    $osp->OSP->ITEMS = $items;

    $response = $client->createOspService($osp);
} 
catch (\SoapFault $fault){
    echo $fault->faultstring;
}

Я получил эту ошибку:

SOAP-ERROR: Encoding: object has no 'ITEM' property

Я не нахожу то, чего не хватает в параметре ITEMS.

ПУНКТЫ должны быть массивом с ПУНКТОМ, но куда я поместил это слово ПУНКТ в моем массиве?!

спасибо, Фил

1 Ответ

0 голосов
/ 19 сентября 2018

Если вы действительно не знаете, как создать запрос и не хотите удивляться, тогда вам обязательно нужно использовать генератор WSDL to PHP, который сгенерирует связанные классы.Вам не нужно будет удивляться, как создать запрос, так как у вас будет каждый класс для каждой структуры.Более того, обработка ответов также будет проще.

Я предлагаю вам проект PackageGenerator , который является хорошим генератором.

...