# 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`コンストラクタは２つの引数を受け取ります:

1. `$wsdl` WSDLファイルのURI あとで`setWsdl($wsdl)`メソッドを使って 設定されるかもしれません。

2. `$options` - SOAPサーバオブジェクトを作成するためのオプション オプションは後で`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' オプションを設定しなければなりません。（下記参照）

２番目のコンストラクタ・パラメータ (`$options`) は、 SOAPサーバオブジェクトを作成するためのオプション配列です オプションは後で`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`オブジェクトに対して、 いくつかのクラスを付与することです:

    ...
    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を定義する２つ目の方法は、 関数のセットや`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();

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

### 高度な利用

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

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

### リクエスト処理

`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();

### レスポンスの事前処理

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

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

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

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