2012-11-07 13 views
5

Obecnie pracuję nad wewnętrzną usługą mydła, aby kontrolować niektóre procesy wewnętrzne. Zwykle nie jest to takie trudne. Próbuję jednak użyć funkcjonalności classmap soapClient do odwzorowania obiektów zamiast pracy ze standardowymi klasami stdClasses, które zwykle są zwracane w przypadku nieskomplikowanych typów.Opcja mapy klas nie działa podczas używania klienta php SoapClient

Biorąc pod uwagę fakt, że wsdl i źródła zajmują dużo miejsca pod kodem, łączę je z odpowiednimi dokumentami, zamiast wysyłać je w tym pytaniu.

Przede wszystkim używam Zend_Soap_Server i Zend_Soap_Server_Autodiscover dla mojej usługi Soap i generowania wsdl.

Mydło kod serwera: wynik https://www.dropbox.com/s/eji7l50g42m2ixl/SoapServer.txt

WSDL na życzenie wsdl: https://www.dropbox.com/s/vyxbjz7wogd8suy/wsdl.txt

Usługa mydło publikuje serviceclass. Ta klasa zawiera metodę uzyskiwania danych z naszej usługi mydlanej. Ta metoda nazywa się getPackages. tworzą

getPackages sposób usługę mydła: https://www.dropbox.com/s/p5ddxpraju7ru6x/method_from_serviceclass.txt

Sposób getPackages zwraca DataObject co z kolei powraca zawiera odniesienia do innych obiektów danych. Obiekty te istnieją na obu serwerach jako klient i są dokładnie takie same na obu końcach.

Głównym przedmiotem dane: https://www.dropbox.com/s/qt51pw3rpq7c2ba/dataobject.txt

Podłączając do tej usługi i wywołanie metody getPackages, otrzymuję odpowiedź, zgodnie z oczekiwaniami: a klasy stdClass zawierający VPS i wspólną własność.

Niestety przy dodawaniu mapy klasy wynik pozostaje dokładnie taki sam ... a stdClass zawiera vps i właściwość współużytkowaną. Oczekiwanym rezultatem będzie obiekt Soho_Soap_DataObject_Packages zawierający vps i właściwości udostępnione.

ten jest stosowany kod SoapClient: https://www.dropbox.com/s/ulnni84p8dawv97/SoapClient.txt

Kiedy wywołać metodę getPackages poprzez Mydło pojawia się następujący:

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

wyjściowa:

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

)

Jednak jeśli spojrzę na respo NSE typy uzyskać następujące:

print_r($SoapClient->__getTypes()); 

wyjściowa:

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 nie pomaga mi dużo ponieważ documentiation classmapping nie jest zbyt wielki, aby zacząć, więc mam nadzieję, że społeczność stosu może świecić światłem na mój problem.

Dwa dni patrzenia na ten sam problem sprawia, że ​​jestem zdesperowany.

Niedawno użyłem SoapClient w taki sam sposób, aby komunikować się z API vsphere vsphere, które działało idealnie, więc myślę, że problem ma coś wspólnego z WDSL, ale obecnie jestem zagubiony.

Dziękuję wszystkim, którzy poświęcają czas, aby z wyprzedzeniem przyjrzeć się mojemu problemowi. Na życzenie przedstawię dodatkowe informacje.

Odpowiedz

9

Jedno wyskakuje gdy patrząc na kod, a to, że instancja zend_soap_server powinny wykorzystywać swoje własne WSDL, tak:

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

Cholera Johannes, teraz wiem, dlaczego ja tęsknię :) Jesteś całkowicie przybiłem to. Zmienił się kod do $ SoapServer = new Zend_Soap_Server ( 'https: // [[URL]]/SoapService /'....? WSDL 'SOAP_VERSION '/' $ serwis, array ('classmap'=> Soho_Soap_ClassMap :: soapMap()) ); który całkowicie to naprawił :) Będę wkrótce musiał kupić ci piwo. –

+0

Zabawne, jak nikt nawet nie zrozumiał pytania, a następnie były kolega przybija go do głowy :) –

+0

@DamienOvereem: Nie mamy tu zbyt wielu użytkowników SOAP, więc na te pytania zwykle nie ma odpowiedzi w ciągu 15 minut;) Również twoje pytanie jest dość duży. Tylko mówię. – hakre

Powiązane problemy