Programmer's Reference Guide
| WSDLアクセッサ |
自動検出
自動検出導入
Zend Frameworkの中で実装されるSOAP機能は、 すべてのステップをより単純なSOAP通信のために必要とされるようにすることを目的とします。
SOAPは言語に依存しないプロトコルです。 そのため、PHPからPHPへの通信だけのために使われないかもしれません。
Zend Frameworkが利用されるかもしれないSOAPアプリケーションのために、 3種類の構成があります:
- SOAPサーバー PHPのアプリケーション <---> SOAPクライアント PHPのアプリケーション
- SOAPサーバー PHPではないアプリケーション <---> SOAPクライアント PHPのアプリケーション
- SOAPサーバー PHPのアプリケーション <---> SOAPクライアント PHPではないアプリケーション
SOAPサーバーで提供される機能を常に知っていなければなりません。 » WSDLは ネットワーク・サービスAPIを詳細に記述するために使われます。
WSDL言語は、十分に複雑です。 (詳しくは» http://www.w3.org/TR/wsdlをご覧下さい) そのため、WSDLの正しい説明を用意することは困難です。
もう一つの問題は、すでに既存のWSDLの変化をネットワーク・サービスAPIで同期することです。
両方の問題は、WSDL自動生成によって解決されるかもしれません。 この必要条件は、SOAPサーバー自動検出です。 それはSOAPサーバー・アプリケーションで使われる、 オブジェクトに類似したオブジェクトを組み立て、 必要な情報を引き出して、この情報を使う正しいWSDLを生成します。
SOAPサーバー・アプリケーションのためにZend Frameworkを使う2つの方法があります:
-
分離されたクラスを使用
-
関数のセットを使用
両方のメソッドは、Zend Framework 自動検出機能によってサポートされます。
Zend_Soap_AutoDiscoverクラスも、 PHPから» XSD型までデータ型マッピングをサポートします。
これは自動検出機能の一般的な用法の例です。 handle()関数はWSDLファイルを生成してブラウザーにポストします。
- class My_SoapServer_Class {
- ...
- }
- $autodiscover = new Zend_Soap_AutoDiscover();
- $autodiscover->setClass('My_SoapServer_Class');
- $autodiscover->handle();
ファイルまたはXMLストリングとして保存するために生成されたWSDLファイルへのアクセスも必要ならば、 AutoDiscoverクラスが提供する dump($filename)または toXml()関数を使えます。
注意: Zend_Soap_AutodiscoverはSOAPサーバーではありません
クラスZend_Soap_AutoDiscoverが 単独でSOAPサーバーの働きをしない点に注意することは、非常に重要です。 それはWSDLを生成して、それがリスンしているurlにアクセスした誰にでも届けるだけです。
SOAPエンドポイントUriがデフォルト値、'http://' .$_SERVER['HTTP_HOST'] . $_SERVER['SCRIPT_NAME']を使いますが、 しかしこれは setUri()関数や Zend_Soap_AutoDiscoverクラスのコンストラクタのパラメータで変更できます。 このエンドポイントではリクエストをリスンする Zend_Soap_Serverクラスを準備しなくてはいけません。
$autodiscover = new Zend_Soap_AutoDiscover(); $autodiscover->setClass('HelloWorldService'); $autodiscover->handle(); } else { //ここで現行ファイルを指示します。 $soap = new Zend_Soap_Server("http://example.com/soap.php?wsdl"); $soap->setClass('HelloWorldService'); $soap->handle(); }
クラスの自動検出
クラスがSOAPサーバー機能を提供することに使われるならば、 同じクラスはWSDL生成のためにZend_Soap_AutoDiscoverに提供されなければなりません:
- $autodiscover = new Zend_Soap_AutoDiscover();
- $autodiscover->setClass('My_SoapServer_Class');
- $autodiscover->handle();
WSDL生成の間、以下の規則が使われます:
-
生成されたWSDLは、RPCスタイルのウェブサービスを記述します。
-
クラス名が、記述されているウェブサービスの名前として使われます。
-
'http://' .$_SERVER['HTTP_HOST'] . $_SERVER['SCRIPT_NAME']が WSDLをデフォルトで利用できるURIとして使われます、 しかし、それは setUri()メソッドによって上書きできます。それは、名前(記述された複雑な型を含む)に関連したすべてのサービスのための ターゲット名前空間としても使われます。
-
クラス・メソッドは、1つの» ポートタイプに 結び付けられます。
$className . 'Port'はポートタイプ名として使われます。 -
各々のクラス・メソッドは、対応するポート操作として登録されます。
-
各々のメソッド・プロトタイプは、対応するリクエスト/レスポンスメッセージを生成します。
いくつかのメソッド・パラメータがオプションならば、 メソッドはいくつかのプロトタイプを持つかもしれません。
注意: 重要!
WSDL自動検出では、パラメータを決定して型を返すために、 開発者により提供されるPHP docblockを利用します。 実際、スカラー型にとっては、パラメータ型を決定する唯一の方法です。 そして、戻り型にとっては、それらを決定する唯一の方法です。
つまり、正しくて詳細で完全なdocblockを提供することは習慣というだけではなく、 発見するクラスのために必要です。
関数の自動検出
関数のセットがSOAPサーバー機能を提供することに使われるならば、 同じセットはWSDL生成のためにZend_Soap_AutoDiscoveryに提供されなければなりません:
- $autodiscover = new Zend_Soap_AutoDiscover();
- $autodiscover->addFunction('function1');
- $autodiscover->addFunction('function2');
- $autodiscover->addFunction('function3');
- ...
- $autodiscover->handle();
WSDL生成の間、以下の規則が使われます:
-
生成されたWSDLは、RPCスタイルのウェブサービスを記述します。
-
現在のスクリプト名が、記述されているウェブサービスの名前として使われます。
-
'http://' .$_SERVER['HTTP_HOST'] . $_SERVER['SCRIPT_NAME']が WSDLを利用できるURIとして使われます。それは、名前(記述された複雑な型を含む)に関連したすべてのサービスのための ターゲット名前空間としても使われます。
-
関数は、1つの» ポートタイプに 結び付けられます。
$functionName . 'Port'はポートタイプ名として使われます。 -
各々の関数は、対応するポート操作として登録されます。
-
各々の関数プロトタイプは、対応するリクエスト/レスポンスメッセージを生成します。
いくつかのメソッド・パラメータがオプションなら、 関数はいくつかのプロトタイプを持つかもしれません。
注意: 重要!
WSDL自動検出では、パラメータを決定して、型を返すために、 開発者により提供されるPHP docblockを利用します。 実際、スカラー型にとっては、パラメータ型を決定する唯一の方法です。 そして、戻り型にとっては、それらを決定する唯一の方法です。
つまり、正しくて詳細で完全なdocblockを提供することは習慣というだけではなく、 発見するクラスのために必要です。
データ型の自動検出
入出力データ型は、以下のマッピングを用いて、ネットワーク・サービス型に変換されます:
-
PHP文字列 <->
xsd:string -
PHP integer <->
xsd:int -
PHP floatおよびdouble値 <->
xsd:float -
PHPブール値 <->
xsd:boolean -
PHP配列 <->
soap-enc:Array -
PHPオブジェクト <->
xsd:struct -
PHPクラス <-> 複雑な型のストラテジーに基づいた (このセクション参照) [1] Zend_Soap_AutoDiscoverZend_Soap_Wsdl_Strategy_DefaultComplexTypeZend_Soap_Wsdl_Strategy_Interface
$extractComplexTypeZend_Soap_Wsdl複雑な型を追加することについて Zend_Soap_Wsdlマニュアル -
type[] または object[] (例えば int[]) <-> 複雑な型のストラテジーに基づいた
-
PHP void <-> 空の型
-
なんらかの理由でこれらの型のいずれとも型が一致しなければ、
xsd:anyTypeが使われます。
xsd: が "http://www.w3.org/2001/XMLSchema" ネームスペースであるところでは、
soap-enc: は "http://schemas.xmlsoap.org/soap/encoding/" ネームスペースで、
tns: はサービスのための "target namespace" です。
WSDLバインディングスタイル
WSDLは、異なるトランスポートのメカニズムとスタイルを提供します。
これは、WSDLのバインディング・セクションの範囲内で、
soap:bindingおよびsoap:bodyタグに影響を及ぼします。
クライアント毎に、本当に機能するオプションについて、それぞれの必要条件があります。
したがって、自動検出クラスでどんなsetClassやaddFunctionメソッドでも呼び出す前に、
スタイルを設定できます。
- $autodiscover = new Zend_Soap_AutoDiscover();
- // デフォルトは 'use' => 'encoded' 及び
- // 'encodingStyle' => 'http://schemas.xmlsoap.org/soap/encoding/' です。
- $autodiscover->setOperationBodyStyle(
- 'namespace' => 'http://framework.zend.com')
- );
- // デフォルトは 'style' => 'rpc' 及び
- // 'transport' => 'http://schemas.xmlsoap.org/soap/http' です。
- $autodiscover->setBindingStyle(
- 'transport' => 'http://framework.zend.com')
- );
- ...
- $autodiscover->addFunction('myfunc1');
- $autodiscover->handle();
| WSDLアクセッサ |
