Ben SOAP kullanarak PHP / dan / dönüş nesneleri veya dizi göndermeniz gerekir. Herhangi bir iyi bağlantılar?
Temelde bir sınıf haritası oluşturmak ve sabun müşteriye geçmek gerekir. Evet bu bir acıdır. Ben genellikle sadece PHP nesnelere Sabun Nesne adını eşleştiren bir yöntem var (yani Person => MY_Person
) ve sadece kod ben elle gerek olanları (yani createdOn => DateTime
).
class MY_WSHelper
{
protected static $ws_map;
public static function make_map()
{
if( ! self::$ws_map)
{
self::$ws_map = array();
//These will be mapped dynamically
self::$ws_map['Person'] = NULL;
self::$ws_map['Animal'] = NULL;
//Hard-coded type map
self::$ws_map['createdOn'] = DateTime;
self::$ws_map['modifiedOn'] = DateTime;
foreach(self::$ws_map as $soap_name => $php_name)
{
if($php_name === NULL)
{
//Map un-mapped SoapObjects to PHP classes
self::$ws_map[$soap_name] = "MY_" . ucfirst($soap_name);
}
}
}
return self::$ws_map;
}
}
İşveren:
$client = new SoapClient('http://someurl.com/personservice?wsdl',
array('classmap' => MY_WSHelper::make_map()));
$aperson = $client->getPerson(array('name' => 'Bob'));
echo get_class($aperson); //MY_Person
echo get_class($aperson->createdOn); //DateTime
Ben Zend_Soap_Server и Zend_Soap_Client kullanıyorum. Ben zor yapısının dizi gönderme / alma.
İlk başta almak istediğiniz yapısı ile sınıf oluşturmak.
<?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;
}
?>
Sonra bu verileri almak için hizmet oluşturmak:
<?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";
}
}
?>
Şimdi url tarafından denetleyicisi Zend_Soap_Server örneğini oluşturmak 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();
}
?>
Ve şimdi size yapısı ile (http://ourhost/soap/?wsdl) wsdl almak ve SoapService::getUserData in isteği işlemek. Bu yöntemde girdi parametr PeopleInformation class of amacı,
Papa Google, bu Zend article Sabun (bunu özellikle PHP5 uygulamasıdır) ile çalışan istemci hem de sunucu yönleri iyi örnekler sürü beni işaret. Iyi bir başlangıç noktası gibi görünüyor.
Eğer biraz benim gibi, ve elle bir WSDL varan yazma düşüncesiyle yalakalık, ben dinamik olarak sizin için bir WSDL oluşturmak için PHP'nin yansıması sınıfları kullanır, WSHelper kullanmanızı tavsiye ediyorum. Kesinlikle bir zaman tasarrufu
Ben (kötü) deneyimlerini paylaşmak için tekrar.
PHP ZendFramework2 (ZF2) kullanarak bir webcoder yarattık.
Sunucu nesneleri ve nesneler dizisi, cevap ve girdi olarak dize alınan kadar iyi çalıştı. Ben ArrayOfTypeComplex strateji kullanarak edildi.
$_strategy = new \Zend\Soap\Wsdl\ComplexTypeStrategy\ArrayOfTypeComplex();
Ben girdi olarak dize bir dizi kullanmaya çalıştığınızda ben Ramil'in cevabı bulana kadar karanlık ve mutsuz vadisinde hissettim, bu yüzden strateji ve tüm çalışma hakkı değiştirmek!
$_strategy = new \Zend\Soap\Wsdl\ComplexTypeStrategy\ArrayOfTypeSequence();
if (isset($_GET['wsdl'])) {
$autodiscover = new \Zend\Soap\AutoDiscover($_strategy);
$autodiscover->setBindingStyle(array('style' => 'document'));
$autodiscover->setOperationBodyStyle(array('use' => 'literal'));
$autodiscover->setClass('Tracker\Queue\Service')
->setUri($_serverUrl);
echo $autodiscover->toXml();
}