2012-01-11 10 views
0

WebService WSDLに従って適切な変数を作成する際に問題があります。私は、この単純な機能をpythonでsuds 0.4 sudo 0.4 SOAPライブラリを使用して実装しました。PHPのデータ型SOAP

Python実装(トラッカーは、WSDLを消費し、私のSOAPクライアントオブジェクトです):

c = self.tracker.factory.create("ns4:Text") 
c.type = "text/html" 
c.content = "my content goes here" 
self.tracker.service.createComment(c) 

どのように私はPHPでこれを実装するのですか?一見すると、私はPHP SOAP拡張モジュールでこれを実現する方法をあまり理解していませんでした。 "... factory.create(" ns4:Text ")はPythonで便利なようです。オブジェクトの属性を調べて、使用可能な関数に簡単に渡すことができます。

本当にオブジェクトを定義する必要はありますか? PHP次の方法:

$c->type = "text/html"; 
$c->content = "my content goes here"; 
$this->tracker->__soapCall('createComment',array($c)); 

この実装は、私が知っていると、オブジェクトのすべての属性を定義することを期待し、私はまた、ネストされた37個の属性の複雑なデータ型を、持っているだけ4それらのが必要であり、I。。すべての属性が定義された完全なオブジェクトとして、まだ4つの属性のみが埋め込まれた状態でサーバーに渡したいと思っていますか?

どんな意味ですか?

要約::pythonはwsdlファイルから完全なオブジェクトを作成しますが、これはどのようにしてPHPで取得できますか?

答えて

1

PHPはWSDLファイルを使用して、汎用オブジェクト、配列、スカラーを引数として渡すことができる適切なメソッドのセットを生成できます。どのクラスをどのメソッド(classmapオプション)にマップするか、どの型宣言をどのシリアライゼーションコールバック関数(typemapオプション)にマップするかをSoapClientクラスの2番目のパラメータを使って指定することもできます。

class doRequestMethod { 
    public $id; 
    public $attribute; 
} 

class theResponseClass { 
    /* ... */ 
} 

$options = array(
    'classmap' => array(
     'doRequest' => 'doRequestMethod', 
     'theResponse' => 'theResponseClass' 
     /* ... */ 
    ), 
    'typemap' => array(
     0 => array(
      'type_ns' => 'http://example.com/schema/wsdl_type.xsd', 
      'type_name"' => 'wsdl_type', 
      'from_xml'  => function ($xml_string) { /* ... */ }, 
      'to_xml'  => function ($soap_object) { /* ... */ } 
     ) 
     /* ... */ 
    ) 
) 

$client = new SoapClient('/path/to/filename.wsdl', $options); 

$request = new doRequestMethod(); 
$request->id = 0; 
$request->attribute = "FooBar"; 
$result = $client->doRequest($request); 

/* 
* If 'dorequest' returns a 'theResponse' in the WSDL, 
* then $result should of the type 'theResponseClass'. 
*/ 
assert(get_class($result) === 'theResponseClass'); 

これは大変な作業ですので、SoapClientのサブクラス化をお勧めします。また、コードをデバッグしやすくするために、できるだけ頻繁に関数とパラメータの引数にPHP型ヒントを使用してください。それはバグのクラス全体を防ぎ、それはマイナーなパフォーマンス上のペナルティに値する。

+1

私はあなたのきれいな答えが好きですが、私はそれがwsdl_type_nsが存在しないようですが、type_nsがあると思われる余分なtypemap配列キーを使っていません。それはタイプミスですか? – Benoit

+0

ありがとう、良いキャッチ!編集されました。 – jmkeyes