自動検出導入
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ファイルを生成してブラウザーにポストします。
span style="color: #ff0000;">'My_SoapServer_Class'
ファイルまたはXMLストリングとして保存するために生成されたWSDLファイルへのアクセスも必要ならば、
AutoDiscoverクラスが提供する dump($filename)または toXml()関数を使えます。
Note: 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クラスを準備しなくてはいけません。
span style="color: #ff0000;">'wsdl''HelloWorldService'//ここで現行ファイルを指示します。
"http://example.com/soap.php?wsdl"'HelloWorldService'
クラスの自動検出
クラスがSOAPサーバー機能を提供することに使われるならば、
同じクラスはWSDL生成のためにZend_Soap_AutoDiscoverに提供されなければなりません:
span style="color: #ff0000;">'My_SoapServer_Class'
WSDL生成の間、以下の規則が使われます:
-
生成されたWSDLは、RPCスタイルのウェブサービスを記述します。
-
クラス名が、記述されているウェブサービスの名前として使われます。
-
'http://' .$_SERVER['HTTP_HOST'] . $_SERVER['SCRIPT_NAME']
が
WSDLをデフォルトで利用できるURIとして使われます、
しかし、それは setUri()メソッドによって上書きできます。
それは、名前(記述された複雑な型を含む)に関連したすべてのサービスのための
ターゲット名前空間としても使われます。
-
クラス・メソッドは、1つの» ポートタイプに
結び付けられます。
$className . 'Port'
はポートタイプ名として使われます。
-
各々のクラス・メソッドは、対応するポート操作として登録されます。
-
各々のメソッド・プロトタイプは、対応するリクエスト/レスポンスメッセージを生成します。
いくつかのメソッド・パラメータがオプションならば、
メソッドはいくつかのプロトタイプを持つかもしれません。
Note: 重要!
WSDL自動検出では、パラメータを決定して型を返すために、
開発者により提供されるPHP docblockを利用します。
実際、スカラー型にとっては、パラメータ型を決定する唯一の方法です。
そして、戻り型にとっては、それらを決定する唯一の方法です。
つまり、正しくて詳細で完全なdocblockを提供することは習慣というだけではなく、
発見するクラスのために必要です。
関数の自動検出
関数のセットがSOAPサーバー機能を提供することに使われるならば、
同じセットはWSDL生成のためにZend_Soap_AutoDiscoveryに提供されなければなりません:
span style="color: #ff0000;">'function1''function2''function3'
WSDL生成の間、以下の規則が使われます:
-
生成されたWSDLは、RPCスタイルのウェブサービスを記述します。
-
現在のスクリプト名が、記述されているウェブサービスの名前として使われます。
-
'http://' .$_SERVER['HTTP_HOST'] . $_SERVER['SCRIPT_NAME']
が
WSDLを利用できるURIとして使われます。
それは、名前(記述された複雑な型を含む)に関連したすべてのサービスのための
ターゲット名前空間としても使われます。
-
関数は、1つの» ポートタイプに
結び付けられます。
$functionName . 'Port'
はポートタイプ名として使われます。
-
各々の関数は、対応するポート操作として登録されます。
-
各々の関数プロトタイプは、対応するリクエスト/レスポンスメッセージを生成します。
いくつかのメソッド・パラメータがオプションなら、
関数はいくつかのプロトタイプを持つかもしれません。
Note: 重要!
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$extractComplexType
Zend_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
メソッドでも呼び出す前に、
スタイルを設定できます。
span style="color: #808080; font-style: italic;">// デフォルトは 'use' => 'encoded' 及び
// 'encodingStyle' => 'http://schemas.xmlsoap.org/soap/encoding/' です。
'use' => 'literal',
'namespace' => 'http://framework.zend.com')
);
// デフォルトは 'style' => 'rpc' 及び
// 'transport' => 'http://schemas.xmlsoap.org/soap/http' です。
'style' => 'document',
'transport' => 'http://framework.zend.com''myfunc1'