Napotkałem kilka różnych plików WSDL, które zawierają element i complexType o tej samej nazwie. Na przykład http://soap.search.msn.com/webservices.asmx?wsdl ma dwie jednostki o nazwie "SearchResponse":Używanie opcji mapowania klasy SoapClient z WSDL zawierającej element i complexType o tej samej nazwie
W tym scenariuszu nie mogę dowiedzieć się, jak poprawnie odwzorować te obiekty na klasy PHP za pomocą opcji "classmaps" SoapClient().
Podręcznik PHP mówi tak:
Opcja classmap mogą być używane do mapowania niektórych typów WSDL klas PHP. Ta opcja musi być tablicą z typami WSDL jako kluczami i nazwami klas PHP jako wartościami.
Niestety, ponieważ istnieją dwa rodzaje WSDL z tego samego klucza („SearchResponse”), nie mogę dowiedzieć się, jak rozróżniać pomiędzy tymi dwoma podmiotami SearchResponse i przypisać je do odpowiednich klas PHP.
Na przykład, tutaj jest odpowiedni fragment przykładowego WSDL:
<xsd:complexType name="SearchResponse">
<xsd:sequence>
<xsd:element minOccurs="1" maxOccurs="1" name="Responses" type="tns:ArrayOfSourceResponseResponses"/>
</xsd:sequence>
</xsd:complexType>
<xsd:element name="SearchResponse">
<xsd:complexType>
<xsd:sequence>
<xsd:element minOccurs="1" maxOccurs="1" name="Response" type="tns:SearchResponse"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
I tu jest PHP, który oczywiście będzie nie działać od czasu classmaps klawiszy są takie same:
<?php $server = new SoapClient("http://soap.search.msn.com/webservices.asmx?wsdl", array('classmap' => array('SearchResponse' => 'MySearchResponseElement', 'SearchResponse' => 'MySearchResponseComplexType'))); ?>
Szukając rozwiązania, znalazłem, że Java Web Services obsługuje to, umożliwiając określenie niestandardowego sufiksu w elementach "Element" lub "ComplexType".
Więc teraz czuję się jak tam jest po prostu nie da się zrobić z PHP SoapClient, ale jestem ciekawy, czy ktoś tam może zaoferować jakąś radę. FWIW, nie mogę edytować zdalnego WDSL.
Jakieś pomysły ???
Brak natychmiastowego pomysłu, ale można sprawdzić komentarz na http://www.php.net/manual/en/soapclient.soapclient.php#94151. Używając wspomnianego 'SoapClient -> __ getTypes()', możesz znaleźć "niejawne" zróżnicowanie typów dwóch elementów, których możesz użyć (tylko zgadnij). –
Henrik, dziękuję za komentarz. __getTypes() zwraca kilka interesujących szczegółów na temat dostępnych struktur danych iw moim przypadku otrzymuję dwie "struktury" o tej samej nazwie, które mają różne atrybuty. Niestety, problem pozostaje: nie mogę mapować tych dwóch struktur do różnych klas PHP ze względu na sposób konfigurowania parametru classmap (gdzie klucz tablicy jest nazwą struktury). – stereoscott