Hiện tại tôi đang làm việc trên một dịch vụ xà phòng nội bộ để kiểm soát một số quy trình nội bộ. Đó là bình thường không phải tất cả những gì khó làm. Tuy nhiên tôi đang cố gắng sử dụng chức năng classMap soapClient để ánh xạ các đối tượng thay vì làm việc với stdClasses mà thường được trả về cho các kiểu không phức tạp.tùy chọn classmap không hoạt động khi sử dụng phpClashClient
Xem xét thực tế là các nguồn và mã nguồn của wsdl chiếm nhiều mã khôn ngoan, tôi sẽ liên kết với các tài liệu liên quan thay vì gửi spam cho chúng trong câu hỏi này.
Trước hết tôi đang sử dụng Zend_Soap_Server và Zend_Soap_Server_Autodiscover cho dịch vụ Xà phòng và thế hệ wsdl của tôi.
Soap mã máy chủ: kết quả https://www.dropbox.com/s/eji7l50g42m2ixl/SoapServer.txt
WSDL cho yêu cầu wsdl: https://www.dropbox.com/s/vyxbjz7wogd8suy/wsdl.txt
Dịch vụ xà phòng xuất bản một serviceclass. Lớp này chứa một phương thức để lấy dữ liệu từ dịch vụ xà phòng của chúng tôi. Phương thức này được gọi là getPackages.
getPackages phương pháp hình thành các dịch vụ xà phòng: https://www.dropbox.com/s/p5ddxpraju7ru6x/method_from_serviceclass.txt
Phương pháp getPackages trả về một DataObject mà trong lợi nhuận lần lượt chứa tham chiếu đến đối tượng dữ liệu khác. Các đối tượng này tồn tại trên cả hai máy chủ dưới dạng máy khách và giống hệt nhau trên cả hai đầu.
Đối tượng dữ liệu chính: https://www.dropbox.com/s/qt51pw3rpq7c2ba/dataobject.txt
Khi kết nối với dịch vụ này và gọi phương thức getPackages, tôi nhận được phản ứng như mong đợi: một stdClass chứa một vps và một tài sản chung.
Không may khi thêm sơ đồ lớp, kết quả vẫn chính xác như cũ .. stdClass chứa vps và thuộc tính được chia sẻ. Kết quả mong đợi sẽ là đối tượng Soho_Soap_DataObject_Packages chứa thuộc tính vps và chia sẻ.
này được mã SoapClient sử dụng: https://www.dropbox.com/s/ulnni84p8dawv97/SoapClient.txt
Khi tôi gọi phương thức getPackages qua xà phòng tôi nhận được như sau:
$SoapClient = \Soho_Soap_Client::getInstance();
$packages = $SoapClient->getPackages();
print_r($packages);
Output:
stdClass Object
(
[shared] => Array
(
[0] => stdClass Object
(
[id] =>
[title] =>
[pricePerPeriod] =>
[price] =>
[minRegistrationMonths] =>
[properties] =>
[options] => Array
(
)
)
)
[vps] =>
)
Tuy nhiên, nếu tôi nhìn vào mặt nạ loại NSE tôi nhận được như sau:
print_r($SoapClient->__getTypes());
Output:
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 không giúp tôi nhiều kể từ khi documentiation classmapping là không phải tất cả quá tuyệt vời để bắt đầu, vì vậy tôi hy vọng cộng đồng chồng có thể làm sáng tỏ vấn đề của tôi.
2 ngày nhìn chằm chằm vào cùng một vấn đề khiến tôi tuyệt vọng.
Một thời gian ngắn trước đây tôi đã sử dụng SoapClient theo cách tương tự để giao tiếp với vmware vsphere API hoạt động hoàn hảo, vì vậy tôi nghĩ vấn đề có liên quan đến WDSL, nhưng hiện tại tôi bị mất.
Tôi cảm ơn tất cả mọi người dành thời gian để xem xét vấn đề của tôi trước cho thời gian của họ. Tôi sẽ ofcourse cung cấp thông tin bổ sung khi được yêu cầu.
Chết tiệt Johannes, bây giờ tôi biết tại sao anh nhớ em :) Bạn hoàn toàn đóng đinh nó. Đã thay đổi thành mã thành $ SoapServer = new Zend_Soap_Server ( 'https: // [[URL]]/SoapService /'. SOAP_VERSION. '/'. $ Service. '? Wsdl', mảng ('classmap' => Soho_Soap_ClassMap :: soapMap()) ); hoàn toàn cố định nó :) Sẽ sớm phải mua cho bạn một ly bia. –
Hài hước như thế nào không ai thậm chí hiểu câu hỏi và sau đó một móng tay cựu collegue nó đứng đầu :) –
@DamienOvereem: Chúng tôi không có nhiều người dùng SOAP ở đây, vì vậy những câu hỏi này thường không được trả lời trong vòng 15 phút;) là khá lớn. Chỉ cần nói. – hakre