numaralı bir içerik ve complexType içeren WSDL içeren PHP SoapClient sınıf haritası seçeneğini kullanarak, bir öğe ve aynı ada sahip bir karmaşıkType içeren birkaç farklı WSDL dosyasıyla karşılaştım. Örneğin, http://soap.search.msn.com/webservices.asmx?wsdl, "SearchResponse" adında iki öğeye sahiptir:Bir öğe ve aynı isimli
Bu senaryoda, SoapClient() "sınıf haritaları" seçeneğini kullanarak bu varlıkları PHP sınıflarına doğru şekilde nasıl eşleyeceğinizi anlayamıyorum.
ClassMap seçeneği PHP sınıflarına bazı WSDL türlerini eşleştirmek için kullanılabilir:
PHP kılavuzu bu diyor. Bu seçeneği, anahtar olarak WSDL türlerine ve değer olarak PHP sınıflarının adlarına sahip bir dizi olmalıdır. Aynı anahtar ('SearchResponse') ile iki WSDL türü vardır beri
yazık ki, iki SearchResponse varlıklar arasında ayrım anlamaya ve bunlara karşılık gelen PHP sınıflarına bunları atanamıyor. anahtarların aynı
<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>
Ve burada açıkça classmaps beri işe yaramaz PHP'dir: Örneğin
, burada örnek WSDL ilgili snippet'tir
<?php $server = new SoapClient("http://soap.search.msn.com/webservices.asmx?wsdl", array('classmap' => array('SearchResponse' => 'MySearchResponseElement', 'SearchResponse' => 'MySearchResponseComplexType'))); ?>
Bir çözüm ararken, Java Web Services'ın bunu, "Element" veya "ComplexType" varlıklarına özel bir sonek belirtmenize izin vererek ele aldığını gördüm.
Yani, şu anda sadece PHP'nin SoapClient ile yapmak için hiçbir yolu yoktur gibi hissediyorum, ama orada kimse herhangi bir tavsiye sunabilir eğer merak ediyorum. FWIW, uzak WDSL'yi düzenleyemiyorum.
Herhangi bir fikir ???
yok hemen bir fikir, ama sen http://www.php.net/manual/en/soapclient.soapclient.php#94151 bulunan Açıklama kontrol edebilir. Belirtilen 'SoapClient -> __ getTypes()' işlevini kullanarak, kullanabileceğiniz iki öğenin 'örtük' türden bir ayrımını (yalnızca bir tahmin olsa da) bulabilirsiniz. –
Henrik, yorumunuz için teşekkürler. __getTypes() mevcut veri yapıları hakkında bazı ilginç ayrıntıları döndürür ve benim durumumda, farklı özelliklere sahip aynı ada sahip iki 'yapı' alıyorum. Ne yazık ki sorun şu şekilde devam ediyor: classmap parametresinin ayarlandığı şekilde (array anahtarının yapının adı olduğu) bu iki yapıyı farklı PHP sınıflarına eşleyemiyorum. – stereoscott