Я пытаюсь интегрировать свою систему с внешней системой WCF в PHP. У меня есть огромный файл wsdl, который имеет много сложных расширенных объектов, поэтому я сгенерировал классы с использованием одноклассников wsdltophp/packagegenerator
,
Теперь у меня есть Request, для которого требуется ArrayOfPartners (объект сгенерированного массива), который содержит Partners (то есть базовый объект). Однако внешняя служба ожидает, что я передам в этом массиве один объект Partner и MotorPartner, который является расширением объекта Partner.
Поскольку MotorPartner расширяет возможности Partner, я могу легко передать его в мой объект PHP ArrayOfPartners. однако сгенерированный xml, который отправляется в сервис, выглядит так:
<ns2:contractPartners>
<ns2:Partner>
<ns2:address>
<ns2:buildingNumber>23A</ns2:buildingNumber>
<ns2:city>EEEE</ns2:city>
<ns2:country xsi:nil="true"/>
<ns2:flatNumber>11</ns2:flatNumber>
<ns2:id xsi:nil="true"/>
<ns2:postalCity>PTASZKOWO</ns2:postalCity>
<ns2:postalCode>33-333</ns2:postalCode>
<ns2:region>
<ns2:communeName>grybów</ns2:communeName>
<ns2:countyName>nowosądecki</ns2:countyName>
<ns2:mainRegionName>małopolskie</ns2:mainRegionName>
</ns2:region>
<ns2:street>KACZYŃSKIEGO</ns2:street>
<ns2:streetPrefix>UL.</ns2:streetPrefix>
</ns2:address>
<ns2:companyCode xsi:nil="true"/>
<ns2:companyName xsi:nil="true"/>
<ns2:contractorType>
<ns2:InternalValue>10</ns2:InternalValue>
</ns2:contractorType>
<ns2:emailAddress>[email protected]</ns2:emailAddress>
<ns2:faxNumber xsi:nil="true"/>
<ns2:firstName>MAREK</ns2:firstName>
<ns2:lastName>JANOWSKI</ns2:lastName>
<ns2:mailingAddress xsi:nil="true"/>
<ns2:partnerRole xsi:nil="true"/>
<ns2:personalCode>77072810211</ns2:personalCode>
<ns2:phoneNumber>654987654</ns2:phoneNumber>
</ns2:Partner>
<ns2:Partner>
<ns2:address>
<ns2:buildingNumber>20A</ns2:buildingNumber>
<ns2:city>TTTT</ns2:city>
<ns2:country xsi:nil="true"/>
<ns2:flatNumber>12</ns2:flatNumber>
<ns2:id xsi:nil="true"/>
<ns2:postalCity>PTASZKOWO</ns2:postalCity>
<ns2:postalCode>33-333</ns2:postalCode>
<ns2:region>
<ns2:communeName>grybów</ns2:communeName>
<ns2:countyName>nowosądecki</ns2:countyName>
<ns2:mainRegionName>małopolskie</ns2:mainRegionName>
</ns2:region>
<ns2:street>KACZYŃSKIEGO</ns2:street>
<ns2:streetPrefix>UL.</ns2:streetPrefix>
</ns2:address>
<ns2:companyCode xsi:nil="true"/>
<ns2:companyName xsi:nil="true"/>
<ns2:contractorType>
<ns2:InternalValue>10</ns2:InternalValue>
</ns2:contractorType>
<ns2:emailAddress>[email protected]</ns2:emailAddress>
<ns2:faxNumber xsi:nil="true"/>
<ns2:firstName>MARIAN</ns2:firstName>
<ns2:lastName>JANOWSKI</ns2:lastName>
<ns2:mailingAddress xsi:nil="true"/>
<ns2:partnerRole xsi:nil="true"/>
<ns2:personalCode>77092110211</ns2:personalCode>
<ns2:phoneNumber>654988854</ns2:phoneNumber>
</ns2:Partner>
</ns2:contractPartners>
Но сервис ожидает получить что-то похожее на:
<ns2:contractPartners>
<ns2:Partner xsi:type="d:MotorPartner"xmlns:d="http://schemas.datacontract.org/2004/07/Interrisk.Calculators.PakietAuto.Common.BusinessObjects.Partner">
<d:address>
<d:buildingNumber>23A</d:buildingNumber>
<d:city>EEEE</d:city>
<d:country xsi:nil="true"/>
<d:flatNumber>11</d:flatNumber>
<d:id xsi:nil="true"/>
<d:postalCity>PTASZKOWO</d:postalCity>
<d:postalCode>33-333</d:postalCode>
<d:region>
<d:communeName>grybów</d:communeName>
<d:countyName>nowosądecki</d:countyName>
<d:mainRegionName>małopolskie</d:mainRegionName>
</d:region>
<d:street>KACZYŃSKIEGO</d:street>
<d:streetPrefix>UL.</d:streetPrefix>
</d:address>
<d:companyCode xsi:nil="true"/>
<d:companyName xsi:nil="true"/>
<d:contractorType>
<d:InternalValue>10</d:InternalValue>
</d:contractorType>
<d:emailAddress>[email protected]</d:emailAddress>
<d:faxNumber xsi:nil="true"/>
<d:firstName>MAREK</d:firstName>
<d:lastName>JANOWSKI</d:lastName>
<d:mailingAddress xsi:nil="true"/>
<d:partnerRole xsi:nil="true"/>
<d:personalCode>77072810211</d:personalCode>
<d:phoneNumber>654987654</d:phoneNumber>
<d:motorRole>11</d:motorRole>
<d:motorType>330</d:motorType>
<d:motorName>OSOBOWE</d:motorName>
</ns2:Partner>
<ns2:Partner>
<ns2:address>
<ns2:buildingNumber>20A</ns2:buildingNumber>
<ns2:city>TTTT</ns2:city>
<ns2:country xsi:nil="true"/>
<ns2:flatNumber>12</ns2:flatNumber>
<ns2:id xsi:nil="true"/>
<ns2:postalCity>PTASZKOWO</ns2:postalCity>
<ns2:postalCode>33-333</ns2:postalCode>
<ns2:region>
<ns2:communeName>grybów</ns2:communeName>
<ns2:countyName>nowosądecki</ns2:countyName>
<ns2:mainRegionName>małopolskie</ns2:mainRegionName>
</ns2:region>
<ns2:street>KACZYŃSKIEGO</ns2:street>
<ns2:streetPrefix>UL.</ns2:streetPrefix>
</ns2:address>
<ns2:companyCode xsi:nil="true"/>
<ns2:companyName xsi:nil="true"/>
<ns2:contractorType>
<ns2:InternalValue>10</ns2:InternalValue>
</ns2:contractorType>
<ns2:emailAddress>[email protected]</ns2:emailAddress>
<ns2:faxNumber xsi:nil="true"/>
<ns2:firstName>MARIAN</ns2:firstName>
<ns2:lastName>JANOWSKI</ns2:lastName>
<ns2:mailingAddress xsi:nil="true"/>
<ns2:partnerRole xsi:nil="true"/>
<ns2:personalCode>77092110211</ns2:personalCode>
<ns2:phoneNumber>654988854</ns2:phoneNumber>
</ns2:Partner>
</ns2:contractPartners>
Как вы можете видеть, данный расширенный объект должен иметь дополнительный xsi: type и некоторые дополнительные поля, которых нет в объекте Partner.
Как я могу добиться этого с PhpClient в режиме ClassMap? (Я не хочу переходить в более сырой режим, так как у меня огромное количество данных и объектов, и эти части являются лишь верхушкой айсберга, тогда будет большая нагрузка).
В PHP мой код на данный момент выглядит так:
$partner = new \InterriskWSDL\Calculator\StructType\Partner();
$partner2 = new \InterriskWSDL\Calculator\StructType\MotorPartner();
$contract->setContractPartners(new \InterriskWSDL\Calculator\ArrayType\ArrayOfPartner([$partner2, $partner]));
$service->calculatePremium($contract);
Задача ещё не решена.
Других решений пока нет …