第50章 Zend_Soap

目次

50.1. Zend_Soap_Server
50.1.1. Zend_Soap_Serverコンストラクタ
50.1.1.1. WSDLモードのためのZend_Soap_Serverコンストラクタ
50.1.1.2. 非WSDLモードのためのZend_Soap_Serverコンストラクタ
50.1.2. ウェブ・サービスAPIを定義するメソッド
50.1.3. リクエストおよびレスポンスオブジェクトの操作
50.1.3.1. リクエスト処理
50.1.3.2. レスポンスの事前処理
50.2. Zend_Soap_Client
50.2.1. Zend_Soap_Clientコンストラクタ
50.2.2. SOAPリクエストの実行
50.3. WSDLアクセッサ
50.3.1. Zend_Soap_Wsdlコンストラクタ
50.3.2. addMessage()メソッド
50.3.3. addPortType()メソッド
50.3.4. addPortOperation()メソッド
50.3.5. addBinding()メソッド
50.3.6. addBindingOperation()メソッド
50.3.7. addSoapBinding()メソッド
50.3.8. addSoapOperation()メソッド
50.3.9. addService()メソッド
50.3.10. 型のマッピング
50.3.10.1. 型情報の取得
50.3.10.2. 複雑な型の情報を追加する
50.3.11. addDocumentation()メソッド
50.3.12. 確定したWSDL文書を取得
50.4. 自動検出
50.4.1. 自動検出導入
50.4.2. クラスの自動検出
50.4.3. 関数の自動検出
50.4.4. データ型の自動検出
50.4.5. WSDLバインディングスタイル

50.1. Zend_Soap_Server

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

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

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

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

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

50.1.1. Zend_Soap_Serverコンストラクタ

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

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

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

  1. $wsdl WSDLファイルのURI [18]

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

    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)呼び出しと同じです。

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

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

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

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

非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ネームスペース

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

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

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

...
class MyClass {
    /**
     * このメソッドは ...
     *
     * @param integer $inputParam
     * @return string
     */
    public function method1($inputParam) {
        ...
    }

    /**
     * このメソッドは ...
     *
     * @param integer $inputParam1
     * @param string  $inputParam2
     * @return float
     */
    public function method2($inputParam1, $inputParam2) {
        ...
    }

    ...
}
...
$server = new Zend_Soap_Server(null, $options);
// クラスをSOAPサーバにバインド
$server->setClass('MyClass');
// 初期化済みのオブジェクトをSOAPサーバにバインド
$server->setObject(new MyClass());
...
$server->handle();

[注意] 重要

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

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

...
/**
 * この関数は...
 *
 * @param integer $inputParam
 * @return string
 */
function function1($inputParam) {
    ...
}

/**
 * この関数は...
 *
 * @param integer $inputParam1
 * @param string  $inputParam2
 * @return float
 */
function function2($inputParam1, $inputParam2) {
    ...
}
...
$server = new Zend_Soap_Server(null, $options);
$server->addFunction('function1');
$server->addFunction('function2');
...
$server->handle();

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

[注意] 高度な利用

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

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

50.1.3.1. リクエスト処理

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

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

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

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

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

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

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

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

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

...
$server = new Zend_Soap_Server(...);
...
$server->handle();
$request = $server->getLastRequest();

50.1.3.2. レスポンスの事前処理

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

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

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

...
$server = new Zend_Soap_Server(...);
...
$server->handle();
$response = $server->getLastResponse();
...



[18] あとでsetWsdl($wsdl)メソッドを使って 設定されるかもしれません。

[19] オプションは後でsetOptions($options)を使って 設定されるかもしれません。

[20] オプションは後でsetOptions($options)メソッドを使って 設定されるかもしれません。

[21] 戻るレスポンスフラグの現在の状態は setReturnResponse() メソッドによりリクエストされます。