2012-11-07 31 views
5

Derzeit arbeite ich an einem internen Soap-Service, um einige interne Prozesse zu steuern. Was normalerweise nicht so schwer ist. Ich versuche jedoch, die soapClient-classmap-Funktionalität zu verwenden, um Objekte zuzuordnen, anstatt mit den stdClasses zu arbeiten, die normalerweise für nicht-komplexe Typen zurückgegeben werden.Classmap-Option funktioniert nicht während der Verwendung von PHP SoapClient

Angesichts der Tatsache, dass Wsdls und Quellen viel Platz Code-weise nehmen, werde ich auf relevante Dokumente verlinken, anstatt sie in dieser Frage zu spammen.

Zuerst verwende ich Zend_Soap_Server und Zend_Soap_Server_Autodiscover für meine Soap-Service und WSDL-Generation. Servercode

Soap: https://www.dropbox.com/s/eji7l50g42m2ixl/SoapServer.txt

WSDL Ergebnis für Wsdl Anfrage: https://www.dropbox.com/s/vyxbjz7wogd8suy/wsdl.txt

Die Seife Dienst veröffentlicht einen serviceclass. Diese Klasse enthält eine Methode zum Abrufen von Daten von unserem Soap-Service. Diese Methode heißt getPackages.

GetPackages Verfahren die Seife Dienstform: https://www.dropbox.com/s/p5ddxpraju7ru6x/method_from_serviceclass.txt

Das GetPackages Verfahren ein Datenobjekt zurückgibt, der wiederum kehren Verweise auf andere Datenobjekte enthält. Diese Objekte existieren auf beiden Servern als Client und sind an beiden Enden identisch.

Das Hauptdatenobjekt: https://www.dropbox.com/s/qt51pw3rpq7c2ba/dataobject.txt

Wenn mit diesem Dienst verbinden und die GetPackages Methode aufrufen, erhalte ich die Antwort wie erwartet: ein stdClass ein vps und eine gemeinsame Eigenschaft enthält.

Unerwarteterweise bleibt das Ergebnis beim Hinzufügen der Klassenmap genau gleich. Eine stdClass, die vps und eine gemeinsame Eigenschaft enthält. Das erwartete Ergebnis wäre ein Soho_Soap_DataObject_Packages-Objekt, das die vps und die gemeinsamen Eigenschaften enthält.

Dies ist der verwendete Soapclient-Code: https://www.dropbox.com/s/ulnni84p8dawv97/SoapClient.txt

Wenn ich die GetPackages Methode durch Soap rufen erhalte ich die folgende:

$SoapClient = \Soho_Soap_Client::getInstance(); 
$packages = $SoapClient->getPackages(); 
print_r($packages); 

Ausgang:

stdClass Object 
(
[shared] => Array 
    (
     [0] => stdClass Object 
      (
       [id] => 
       [title] => 
       [pricePerPeriod] => 
       [price] => 
       [minRegistrationMonths] => 
       [properties] => 
       [options] => Array 
        (
        ) 
      ) 
    ) 
[vps] => 

)

Allerdings, wenn ich mir das Respo ansehe nse Arten ich folgendes:

print_r($SoapClient->__getTypes()); 

Ausgang:

Array 
    (
    [0] => Soho_Soap_DataObject_Package_Shared ArrayOfSoho_Soap_DataObject_Package_Shared[] 
    [1] => struct stdClass { 

    } 
    [2] => Soho_Soap_DataObject_Package_Shared_Option ArrayOfSoho_Soap_DataObject_Package_Shared_Option[] 
    [3] => struct Soho_Soap_DataObject_Package_Shared_Option { 
     string title; 
     string value; 
    } 
    [4] => struct Soho_Soap_DataObject_Package_Shared { 
     int id; 
     string title; 
     int pricePerPeriod; 
     int price; 
     int minRegistrationMonths; 
     stdClass properties; 
     ArrayOfSoho_Soap_DataObject_Package_Shared_Option options; 
    } 
    [5] => Soho_Soap_DataObject_Package_Vps ArrayOfSoho_Soap_DataObject_Package_Vps[] 
    [6] => Soho_Soap_DataObject_Package_Vps_Option ArrayOfSoho_Soap_DataObject_Package_Vps_Option[] 
    [7] => struct Soho_Soap_DataObject_Package_Vps_Option { 
     string title; 
     string value; 
    } 
    [8] => struct Soho_Soap_DataObject_Package_Vps { 
     int id; 
     string title; 
     int pricePerPeriod; 
     int price; 
     int minRegistrationMonths; 
     stdClass properties; 
     ArrayOfSoho_Soap_DataObject_Package_Vps_Option options; 
    } 
    [9] => struct Soho_Soap_DataObject_Packages { 
     ArrayOfSoho_Soap_DataObject_Package_Shared shared; 
     ArrayOfSoho_Soap_DataObject_Package_Vps vps; 
    } 
    )   

Google wird mir nicht viel helfen, da die Classmapping documentiation nicht allzu groß ist, mit zu beginnen, so dass ich hoffe, dass die Stapel-Community kann ein Licht auf mein Problem werfen.

2 Tage starren auf das gleiche Problem macht mich verzweifelt.

Vor kurzem benutzte ich SoapClient auf die gleiche Weise, um mit einer vmware vsphere API zu kommunizieren, die perfekt funktionierte, also denke ich, dass das Problem etwas mit der WDSL zu tun hat, aber momentan bin ich verloren.

Ich danke allen, die sich die Zeit nehmen, mein Problem im Voraus für ihre Zeit zu betrachten. Ich werde natürlich zusätzliche Informationen liefern, wenn Sie dazu aufgefordert werden.

Antwort

9

Eine Sache, springt heraus, wenn Blick auf den Code, und das ist, dass die zend_soap_server Instanz seine eigene WSDL verwendet werden soll, wie folgt aus:

$SoapServer = new Zend_Soap_Server($urltowsdl, array('classmap' => $classmap)); 
+0

Verdammt Johannes, jetzt weiß ich, warum ich dich vermissen :) Sie total geschafft. In Code geändert in $ SoapServer = neuer Zend_Soap_Server ( 'https: // [[URL]]/SoapService /'. SOAP_VERSION. '/'. $ Dienst. '? Wsdl', Array ('classmap' => Soho_Soap_ClassMap :: soapMap()) ); was total behoben :) Will muss dir bald ein Bier kaufen. –

+0

Komisch wie niemand die Frage überhaupt verstanden hat und dann ein Ex-Kollege es nagelt :) –

+0

@DamenOvereem: Wir haben nicht so viele SOAP User hier, also werden diese Fragen normalerweise nicht innerhalb von 15 Minuten beantwortet;) Auch deine Frage ist ziemlich groß. Sag es einfach. – hakre

Verwandte Themen