2009-06-17 12 views

答えて

0

私はこれをZend articleに教えています。これは、Soap(特にPHP5の実装)を扱うクライアントとサーバーの両方の面で多くの良い例があります。良い出発点のように見えます。

WSDLを手作業で書くことを考えていたら、PHPのリフレクションクラスを使用してWSDLを動的に生成するWSHelperを使用することをお勧めします。間違いなく時間を節約する

1

基本的にクラスマップを作成し、それをあなたの石鹸クライアントに渡す必要があります。はい、それは痛みです。私は通常、Soap Objectの名前をPHPオブジェクト(つまりPerson => MY_Person)にマップし、必要なものだけを手作業でコード化するメソッドを用意しています(つまり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; 
    } 
} 

クライアント:

$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 

http://php.net/manual/en/soapclient.soapclient.php

2

私は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"; 
    } 
} 
?> 

は今URL http://ourhost/soap/によってコントローラにZend_Soap_Serverのインスタンスを作成します。

<?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 GET:// ourhostを/ soap /?wsdl)を使用して、SoapService :: getUserDataに構造と処理のリクエストを送信します。このメソッドの入力パラメータはのオブジェクトですPeopleInformationクラス

0

私は(悪い)経験を共有するために、再生します。

PHP ZendFramework2(ZF2)を使用してWebサービスを作成しました。

サーバはオブジェクトとオブジェクトの配列を返答し、それが入力として文字列を受け取るまでうまくいきました。私はArrayOfTypeComplex戦略を使用していました。

$_strategy = new \Zend\Soap\Wsdl\ComplexTypeStrategy\ArrayOfTypeComplex(); 

私は、入力として文字列の配列を使用しようと、私はラミルの答えを見つけるまで、私は暗いと不幸な谷に感じたので、私は戦略とすべての作業の権利を変更!

$_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(); 
} 
関連する問題