Я использую Zend_Soap_Server и Zend_Soap_Client. Я отправляю / получаю массив сложной структуры.
Сначала создайте класс со структурой, которую вы хотите получить.
<?php
/**
* Information about people
*/
class PeopleInformation
{
/**
* Name of ...
*
* @var string
*/
public $name;
/**
* Age of
* @var int
*/
public $age;
/**
* Array of family
*
* @var FamilyInformation[]
*/
public $family;
}
/**
* Information about his family
*/
class FamilyInformation
{
/**
* Mother/sister/bro etc
*
* @var string
*/
public $relation;
/**
* Name
* @var string
*/
public $name;
}
?>
Затем создайте сервис для получения этих данных:
<?php
/**
* Service to receive SOAP data
*/
class SoapService
{
/**
*
* @param PeopleInformation $data
* @return string
*/
public function getUserData($data)
{
//here $data is object of PeopleInformation class
return "OK";
}
}
?>
Теперь создайте экземпляр Zend_Soap_Server в контроллере по URL http://ourhost/soap/:
<?php
//disable wsdl caching
ini_set('soap.wsdl_cache_enabled', 0);
ini_set('soap.wsdl_cache', 0);
$wsdl = $_GET['wsdl'];
//this generate wsdl from our class SoapService
if (!is_null($wsdl))
{
$autodiscover = new Zend_Soap_AutoDiscover('Zend_Soap_Wsdl_Strategy_ArrayOfTypeSequence');
$autodiscover->setClass('SoapService');
$autodiscover->handle();
}
//handle all soap request
else
{
$wsdlPath = 'http://ourhost/soap/?wsdl';
$soap = new Zend_Soap_Server($wsdlPath, array(
'cache_wsdl' => false
));
$soap->registerFaultException('Zend_Soap_Server_Exception');
$soap->setClass('SoapService');
$soap->handle();
}
?>
И теперь вы получаете wsdl (http://ourhost/soap/?wsdl) с вашей структурой и обработкой запроса в SoapService :: getUserData . Входным параметром в этом методе является объект PeopleInformation class