Zend_Soap

Zend_Soap_Server(日本語)

Zend_Soap_Serverクラスは、 ウェブ・サービス部分の開発をPHPプログラマーにとって簡単にすることを目的としています。

それは、ウェブサービスAPIを定義するクラスまたは機能を使って、 WSDLモードまたは非WSDLモードで使われるかもしれません。

Zend_Soap_ServerコンポーネントがWSDLモードで動くとき、 サーバオブジェクトの挙動とトランスポート層オプションを定義する すでに用意されたWSDLドキュメントを使います。

WSDLドキュメントは Zend_Soap_AutoDiscoveryコンポーネント によって提供される機能によって自動的に生成されるか、 または、Zend_Soap_Wsdlクラスや、 その他のXML生成ツールを使って、 手動で構成されます。

非WSDLモードが使われるならば、 すべてのプロトコル・オプションはオプション・メカニズムを用いて設定されなければなりません。

Zend_Soap_Serverコンストラクタ

Zend_Soap_Serverコンストラクタは、 WSDLモードと非WSDLモードとでは少し使い方が違います。

WSDLモードのためのZend_Soap_Serverコンストラクタ

WSDLモードで動作する場合、Zend_Soap_Serverコンストラクタは2つの引数を受け取ります:

  1. $wsdl WSDLファイルのURI [1] setWsdl($wsdl)

  2. $options - SOAPサーバオブジェクトを作成するためのオプション [2] setOptions($options)

    WSDLモードでは下記のオプションが許されています:

    • 'soap_version' ('soapVersion') - 使用するSOAPバージョン (SOAP_1_1 または SOAP_1_2)

    • 'actor' - サーバのためのアクターURI

    • 'classmap' ('classMap') - 一部の WSDL 型をPHPクラスにマップするために使います。

      このオプションは、キーとしてWSDL型、値としてPHPクラス名をもつ配列でなければなりません。

    • 'encoding' - 内部文字エンコーディング。 (対外的なエンコーディングとしてUTF-8が常に使われます)

    • 'wsdl' setWsdl($wsdlValue)呼び出しと同じです。

非WSDLモードのためのZend_Soap_Serverコンストラクタ

非WSDLモードでZend_Soap_Server機能を使うつもりなら、 最初のコンストラクタ・パラメータはNULLに設定しなければなりません

この場合、'uri' オプションを設定しなければなりません。(下記参照)

2番目のコンストラクタ・パラメータ ($options) は、 SOAPサーバオブジェクトを作成するためのオプション配列です [3] setOptions($options)

非WSDLモードでは下記のオプションが許されています:

  • 'soap_version' ('soapVersion') - 使用するSOAPバージョン (SOAP_1_1 または SOAP_1_2)

  • 'actor' - サーバのためのアクターURI

  • 'classmap' ('classMap') - 一部の WSDL 型をPHPクラスにマップするために使います。

    このオプションは、キーとしてWSDL型、値としてPHPクラス名をもつ配列でなければなりません。

  • 'encoding' - 内部文字エンコーディング。 (対外的なエンコーディングとしてUTF-8が常に使われます)

  • 'uri' (必須) - SOAPサーバのためのURIネームスペース

ウェブ・サービスAPIを定義するメソッド

SOAPを通してPHPコードにアクセスすることを許可したいときに、 ウェブサービスAPIを定義する2つの方法があります。

最初の一つは、ウェブサービスAPIを完全に記述しなければならないZend_Soap_Serverオブジェクトに対して、 いくつかのクラスを付与することです:

  1. ...
  2. class MyClass {
  3.     /**
  4.      * このメソッドは ...
  5.      *
  6.      * @param integer $inputParam
  7.      * @return string
  8.      */
  9.     public function method1($inputParam) {
  10.         ...
  11.     }
  12.  
  13.     /**
  14.      * このメソッドは ...
  15.      *
  16.      * @param integer $inputParam1
  17.      * @param string  $inputParam2
  18.      * @return float
  19.      */
  20.     public function method2($inputParam1, $inputParam2) {
  21.         ...
  22.     }
  23.  
  24.     ...
  25. }
  26. ...
  27. $server = new Zend_Soap_Server(null, $options);
  28. // クラスをSOAPサーバにバインド
  29. $server->setClass('MyClass');
  30. // 初期化済みのオブジェクトをSOAPサーバにバインド
  31. $server->setObject(new MyClass());
  32. ...
  33. $server->handle();

Note: 重要
対応するウェブサービスWSDLを準備するautodiscover機能を使うつもりならば、 メソッドdocblockを使って各々のメソッドを完全に記述しなければなりません。

ウェブサービスAPIを定義する2つ目の方法は、 関数のセットや addFunction()または loadFunctions()メソッドを使うことです:

  1. ...
  2. /**
  3. * この関数は...
  4. *
  5. * @param integer $inputParam
  6. * @return string
  7. */
  8. function function1($inputParam) {
  9.     ...
  10. }
  11.  
  12. /**
  13. * この関数は...
  14. *
  15. * @param integer $inputParam1
  16. * @param string  $inputParam2
  17. * @return float
  18. */
  19. function function2($inputParam1, $inputParam2) {
  20.     ...
  21. }
  22. ...
  23. $server = new Zend_Soap_Server(null, $options);
  24. $server->addFunction('function1');
  25. $server->addFunction('function2');
  26. ...
  27. $server->handle();

リクエストおよびレスポンスオブジェクトの操作

Note: 高度な利用
このセクションではリクエスト/レスポンス処理の高度なオプションを説明します。 スキップされるかもしれません。

Zend_Soap_Serverコンポーネントは自動的にリクエスト/レスポンス処理を実行します。 しかし、その処理を捕まえて何らかの事前もしくは事後の処理をさせることもできます。

リクエスト処理

Zend_Soap_Server::handle()メソッドは、 標準的な入力ストリーム ('php://input') からリクエストを取得します。 それは、 handle()メソッドにオプションのパラメータを供給することによって、 または、 setRequest()メソッドを用いてリクエストを設定することによって 上書きされるかもしれません:

  1. ...
  2. $server = new Zend_Soap_Server(...);
  3. ...
  4. // オプションの $request パラメータを使ってリクエストを設定
  5. $server->handle($request);
  6. ...
  7. // setRequest() メソッドを使ってリクエストを設定
  8. $server->setRequest();
  9. $server->handle();

リクエストオブジェクトは以下のどれかを用いて表されるかもしれません:

  • DOMDocument (XMLにキャストされます)

  • DOMNode ( 所有者のドキュメントは横取りされてXMLにキャストされます)

  • SimpleXMLElement (XMLにキャストされます)

  • stdClass (__toString() が呼び出されて、有効なXMLであることが確かめられます)

  • string (有効なXMLであることが確かめられます)

最後に処理されたリクエストは getLastRequest()メソッドを使ってXML文字列として取得されます:

  1. ...
  2. $server = new Zend_Soap_Server(...);
  3. ...
  4. $server->handle();
  5. $request = $server->getLastRequest();

レスポンスの事前処理

Zend_Soap_Server::handle()メソッドは、出力ストリームに生成されたレスポンスを自動的に送ります。 それは setReturnResponse()にパラメータとして TRUEまたはFALSEを与えてブロックできます。 [4] setReturnResponse() 生成されたレスポンスはこの場合、 handle()メソッドにより戻されます。

  1. ...
  2. $server = new Zend_Soap_Server(...);
  3. ...
  4. // 標準出力に送る代わりに、
  5. //handle() メソッドの返り値としてレスポンスを取得
  6. $server->setReturnResponse(true);
  7. ...
  8. $response = $server->handle();
  9. ...

ある処理のために、最後のレスポンスを getLastResponse()メソッドで取得することもできます:

  1. ...
  2. $server = new Zend_Soap_Server(...);
  3. ...
  4. $server->handle();
  5. $response = $server->getLastResponse();
  6. ...
[1] あとでメソッドを使って 設定されるかもしれません。
[2] オプションは後でを使って 設定されるかもしれません。
[3] オプションは後でメソッドを使って 設定されるかもしれません。
[4] 戻るレスポンスフラグの現在の状態は メソッドによりリクエストされます。

Zend_Soap