Zend_Soap_AutoDiscovery.xml 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!-- Reviewed: no -->
  3. <!-- EN-Revision: 24249 -->
  4. <sect1 id="zend.soap.autodiscovery">
  5. <title>自動検出</title>
  6. <sect2 id="zend.soap.autodiscovery.introduction">
  7. <title>自動検出導入</title>
  8. <para>
  9. Zend Frameworkの中で実装される<acronym>SOAP</acronym>機能は、
  10. すべてのステップをより単純な<acronym>SOAP</acronym>通信のために必要とされるようにすることを目的とします。
  11. </para>
  12. <para>
  13. <acronym>SOAP</acronym>は言語に依存しないプロトコルです。
  14. そのため、<acronym>PHP</acronym>から<acronym>PHP</acronym>への通信だけのために使われないかもしれません。
  15. </para>
  16. <para>
  17. Zend Frameworkが利用されるかもしれない<acronym>SOAP</acronym>アプリケーションのために、
  18. 3種類の構成があります:
  19. <orderedlist>
  20. <listitem>
  21. <simpara><acronym>SOAP</acronym>サーバー <acronym>PHP</acronym>のアプリケーション &lt;---&gt; <acronym>SOAP</acronym>クライアント <acronym>PHP</acronym>のアプリケーション</simpara>
  22. </listitem>
  23. <listitem>
  24. <simpara><acronym>SOAP</acronym>サーバー <acronym>PHP</acronym>ではないアプリケーション &lt;---&gt; <acronym>SOAP</acronym>クライアント <acronym>PHP</acronym>のアプリケーション</simpara>
  25. </listitem>
  26. <listitem>
  27. <simpara><acronym>SOAP</acronym>サーバー <acronym>PHP</acronym>のアプリケーション &lt;---&gt; <acronym>SOAP</acronym>クライアント <acronym>PHP</acronym>ではないアプリケーション</simpara>
  28. </listitem>
  29. </orderedlist>
  30. </para>
  31. <para>
  32. <acronym>SOAP</acronym>サーバーで提供される機能を常に知っていなければなりません。
  33. <ulink url="http://www.w3.org/TR/wsdl">WSDL</ulink>は
  34. ネットワーク・サービス<acronym>API</acronym>を詳細に記述するために使われます。
  35. </para>
  36. <para>
  37. WSDL言語は、十分に複雑です。
  38. (詳しくは<ulink url="http://www.w3.org/TR/wsdl">http://www.w3.org/TR/wsdl</ulink>をご覧下さい)
  39. そのため、WSDLの正しい説明を用意することは困難です。
  40. </para>
  41. <para>
  42. もう一つの問題は、すでに既存のWSDLの変化をネットワーク・サービス<acronym>API</acronym>で同期することです。
  43. </para>
  44. <para>
  45. 両方の問題は、WSDL自動生成によって解決されるかもしれません。
  46. この必要条件は、<acronym>SOAP</acronym>サーバー自動検出です。
  47. それは<acronym>SOAP</acronym>サーバー・アプリケーションで使われる、
  48. オブジェクトに類似したオブジェクトを組み立て、
  49. 必要な情報を引き出して、この情報を使う正しいWSDLを生成します。
  50. </para>
  51. <para>
  52. <acronym>SOAP</acronym>サーバー・アプリケーションのためにZend Frameworkを使う2つの方法があります:
  53. <itemizedlist>
  54. <listitem>
  55. <para>分離されたクラスを使用</para>
  56. </listitem>
  57. <listitem>
  58. <para>関数のセットを使用</para>
  59. </listitem>
  60. </itemizedlist>
  61. </para>
  62. <para>
  63. 両方のメソッドは、Zend Framework 自動検出機能によってサポートされます。
  64. </para>
  65. <para>
  66. <classname>Zend_Soap_AutoDiscover</classname>クラスも、
  67. <acronym>PHP</acronym>から<ulink url="http://www.w3.org/TR/xmlschema-2/">XSD型</ulink>までデータ型マッピングをサポートします。
  68. </para>
  69. <para>
  70. これは自動検出機能の一般的な用法の例です。
  71. <methodname>handle()</methodname>関数はWSDLファイルを生成してブラウザーにポストします。
  72. </para>
  73. <programlisting language="php"><![CDATA[
  74. class My_SoapServer_Class {
  75. ...
  76. }
  77. $autodiscover = new Zend_Soap_AutoDiscover();
  78. $autodiscover->setClass('My_SoapServer_Class');
  79. $autodiscover->handle();
  80. ]]></programlisting>
  81. <para>
  82. ファイルまたは<acronym>XML</acronym>ストリングとして保存するために生成されたWSDLファイルへのアクセスも必要ならば、
  83. AutoDiscoverクラスが提供する<methodname>dump($filename)</methodname>または<methodname>toXml()</methodname>関数を使えます。
  84. </para>
  85. <note id="zend.soap.autodiscovery.introduction.noserver">
  86. <title>Zend_Soap_AutodiscoverはSOAPサーバーではありません</title>
  87. <para>
  88. クラス<classname>Zend_Soap_AutoDiscover</classname>が
  89. 単独で<acronym>SOAP</acronym>サーバーの働きをしない点に注意することは、非常に重要です。
  90. それはWSDLを生成して、それがリスンしているurlにアクセスした誰にでも届けるだけです。
  91. </para>
  92. <para>
  93. <acronym>SOAP</acronym>エンドポイントUriがデフォルト値、
  94. <code>'http://' .$_SERVER['HTTP_HOST'] . $_SERVER['SCRIPT_NAME']</code>
  95. を使いますが、
  96. しかしこれは<methodname>setUri()</methodname>関数や
  97. <classname>Zend_Soap_AutoDiscover</classname>クラスのコンストラクタのパラメータで変更できます。
  98. このエンドポイントではリクエストをリスンする
  99. <classname>Zend_Soap_Server</classname>クラスを準備しなくてはいけません。
  100. </para>
  101. <programlisting language="php"><![CDATA[
  102. if(isset($_GET['wsdl'])) {
  103. $autodiscover = new Zend_Soap_AutoDiscover();
  104. $autodiscover->setClass('HelloWorldService');
  105. $autodiscover->handle();
  106. } else {
  107. //ここで現行ファイルを指示します。
  108. $soap = new Zend_Soap_Server("http://example.com/soap.php?wsdl");
  109. $soap->setClass('HelloWorldService');
  110. $soap->handle();
  111. }
  112. ]]></programlisting>
  113. </note>
  114. </sect2>
  115. <sect2 id="zend.soap.autodiscovery.class">
  116. <title>クラスの自動検出</title>
  117. <para>
  118. クラスが<acronym>SOAP</acronym>サーバー機能を提供することに使われるならば、
  119. 同じクラスはWSDL生成のために<classname>Zend_Soap_AutoDiscover</classname>に提供されなければなりません:
  120. </para>
  121. <programlisting language="php"><![CDATA[
  122. $autodiscover = new Zend_Soap_AutoDiscover();
  123. $autodiscover->setClass('My_SoapServer_Class');
  124. $autodiscover->handle();
  125. ]]></programlisting>
  126. <para>
  127. WSDL生成の間、以下の規則が使われます:
  128. <itemizedlist>
  129. <listitem>
  130. <para>生成されたWSDLは、RPCスタイルのウェブサービスを記述します。</para>
  131. </listitem>
  132. <listitem>
  133. <para>クラス名が、記述されているウェブサービスの名前として使われます。</para>
  134. </listitem>
  135. <listitem>
  136. <para>
  137. <code>'http://' .$_SERVER['HTTP_HOST'] . $_SERVER['SCRIPT_NAME']</code>が
  138. WSDLをデフォルトで利用できる<acronym>URI</acronym>として使われます、
  139. しかし、それは<methodname>setUri()</methodname>メソッドによって上書きできます。
  140. </para>
  141. <para>
  142. それは、名前(記述された複雑な型を含む)に関連したすべてのサービスのための
  143. ターゲット名前空間としても使われます。
  144. </para>
  145. </listitem>
  146. <listitem>
  147. <para>
  148. クラス・メソッドは、1つの<ulink url="http://www.w3.org/TR/wsdl#_porttypes">ポートタイプ</ulink>に
  149. 結び付けられます。
  150. </para>
  151. <para>
  152. <code>$className . 'Port'</code>はポートタイプ名として使われます。
  153. </para>
  154. </listitem>
  155. <listitem>
  156. <para>各々のクラス・メソッドは、対応するポート操作として登録されます。</para>
  157. </listitem>
  158. <listitem>
  159. <para>各々のメソッド・プロトタイプは、対応するリクエスト/レスポンスメッセージを生成します。</para>
  160. <para>いくつかのメソッド・パラメータがオプションならば、
  161. メソッドはいくつかのプロトタイプを持つかもしれません。</para>
  162. </listitem>
  163. </itemizedlist>
  164. </para>
  165. <note>
  166. <title>重要!</title>
  167. <para>
  168. WSDL自動検出では、パラメータを決定して型を返すために、
  169. 開発者により提供される<acronym>PHP</acronym> docblockを利用します。
  170. 実際、スカラー型にとっては、パラメータ型を決定する唯一の方法です。
  171. そして、戻り型にとっては、それらを決定する唯一の方法です。
  172. </para>
  173. <para>
  174. つまり、正しくて詳細で完全なdocblockを提供することは習慣というだけではなく、
  175. 発見するクラスのために必要です。
  176. </para>
  177. </note>
  178. </sect2>
  179. <sect2 id="zend.soap.autodiscovery.functions">
  180. <title>関数の自動検出</title>
  181. <para>
  182. 関数のセットが<acronym>SOAP</acronym>サーバー機能を提供することに使われるならば、
  183. 同じセットはWSDL生成のために<classname>Zend_Soap_AutoDiscovery</classname>に提供されなければなりません:
  184. </para>
  185. <programlisting language="php"><![CDATA[
  186. $autodiscover = new Zend_Soap_AutoDiscover();
  187. $autodiscover->addFunction('function1');
  188. $autodiscover->addFunction('function2');
  189. $autodiscover->addFunction('function3');
  190. ...
  191. $autodiscover->handle();
  192. ]]></programlisting>
  193. <para>
  194. WSDL生成の間、以下の規則が使われます:
  195. <itemizedlist>
  196. <listitem>
  197. <para>生成されたWSDLは、RPCスタイルのウェブサービスを記述します。</para>
  198. </listitem>
  199. <listitem>
  200. <para>現在のスクリプト名が、記述されているウェブサービスの名前として使われます。</para>
  201. </listitem>
  202. <listitem>
  203. <para>
  204. <code>'http://' .$_SERVER['HTTP_HOST'] . $_SERVER['SCRIPT_NAME']</code>が
  205. WSDLを利用できる<acronym>URI</acronym>として使われます。
  206. </para>
  207. <para>
  208. それは、名前(記述された複雑な型を含む)に関連したすべてのサービスのための
  209. ターゲット名前空間としても使われます。
  210. </para>
  211. </listitem>
  212. <listitem>
  213. <para>
  214. 関数は、1つの<ulink url="http://www.w3.org/TR/wsdl#_porttypes">ポートタイプ</ulink>に
  215. 結び付けられます。
  216. </para>
  217. <para>
  218. <code>$functionName . 'Port'</code>はポートタイプ名として使われます。
  219. </para>
  220. </listitem>
  221. <listitem>
  222. <para>各々の関数は、対応するポート操作として登録されます。</para>
  223. </listitem>
  224. <listitem>
  225. <para>各々の関数プロトタイプは、対応するリクエスト/レスポンスメッセージを生成します。</para>
  226. <para>いくつかのメソッド・パラメータがオプションなら、
  227. 関数はいくつかのプロトタイプを持つかもしれません。</para>
  228. </listitem>
  229. </itemizedlist>
  230. </para>
  231. <note>
  232. <title>重要!</title>
  233. <para>
  234. WSDL自動検出では、パラメータを決定して、型を返すために、
  235. 開発者により提供される<acronym>PHP</acronym> docblockを利用します。
  236. 実際、スカラー型にとっては、パラメータ型を決定する唯一の方法です。
  237. そして、戻り型にとっては、それらを決定する唯一の方法です。
  238. </para>
  239. <para>
  240. つまり、正しくて詳細で完全なdocblockを提供することは習慣というだけではなく、
  241. 発見するクラスのために必要です。
  242. </para>
  243. </note>
  244. </sect2>
  245. <sect2 id="zend.soap.autodiscovery.datatypes">
  246. <title>データ型の自動検出</title>
  247. <para>
  248. 入出力データ型は、以下のマッピングを用いて、ネットワーク・サービス型に変換されます:
  249. <itemizedlist>
  250. <listitem>
  251. <para><acronym>PHP</acronym>文字列 &lt;-&gt; <code>xsd:string</code></para>
  252. </listitem>
  253. <listitem>
  254. <para><acronym>PHP</acronym> integer &lt;-&gt; <code>xsd:int</code></para>
  255. </listitem>
  256. <listitem>
  257. <para><acronym>PHP</acronym> floatおよびdouble値 &lt;-&gt; <code>xsd:float</code></para>
  258. </listitem>
  259. <listitem>
  260. <para><acronym>PHP</acronym>ブール値 &lt;-&gt; <code>xsd:boolean</code></para>
  261. </listitem>
  262. <listitem>
  263. <para><acronym>PHP</acronym>配列 &lt;-&gt; <code>soap-enc:Array</code></para>
  264. </listitem>
  265. <listitem>
  266. <para><acronym>PHP</acronym>オブジェクト &lt;-&gt; <code>xsd:struct</code></para>
  267. </listitem>
  268. <listitem>
  269. <para>
  270. <acronym>PHP</acronym>クラス &lt;-&gt; 複雑な型のストラテジーに基づいた (<link linkend="zend.soap.wsdl.types.add_complex">このセクション</link>参照)
  271. <footnote>
  272. <para>
  273. <classname>Zend_Soap_AutoDiscover</classname>は複雑な型のための検出アルゴリズムとして
  274. <classname>Zend_Soap_Wsdl_Strategy_DefaultComplexType</classname>クラスで生成されます。
  275. AutoDiscoverコンストラクタの最初のパラメータは、
  276. <classname>Zend_Soap_Wsdl_Strategy_Interface</classname>を実装した、
  277. どんな複雑な型ストラテジーでも、クラスの名前を持つ文字列でもとります。
  278. <code>$extractComplexType</code>との後方互換性のために、
  279. ブール変数は<classname>Zend_Soap_Wsdl</classname>のように解析されます。
  280. 詳しくは<link linkend="zend.soap.wsdl.types.add_complex">複雑な型を追加することについて
  281. <classname>Zend_Soap_Wsdl</classname>マニュアル</link>をご覧下さい。
  282. </para>
  283. </footnote>
  284. </para>
  285. </listitem>
  286. <listitem>
  287. <para>type[] または object[] (例えば int[]) &lt;-&gt; 複雑な型のストラテジーに基づいた</para>
  288. </listitem>
  289. <listitem>
  290. <para><acronym>PHP</acronym> void &lt;-&gt; 空の型</para>
  291. </listitem>
  292. <listitem>
  293. <para>なんらかの理由でこれらの型のいずれとも型が一致しなければ、<code>xsd:anyType</code>が使われます。</para>
  294. </listitem>
  295. </itemizedlist>
  296. <code>xsd:</code> が "http://www.w3.org/2001/XMLSchema" ネームスペースであるところでは、
  297. <code>soap-enc:</code> は "http://schemas.xmlsoap.org/soap/encoding/" ネームスペースで、
  298. <code>tns:</code> はサービスのための "target namespace" です。
  299. </para>
  300. </sect2>
  301. <sect2 id="zend.soap.autodiscovery.wsdlstyles">
  302. <title>WSDLバインディングスタイル</title>
  303. <para>
  304. WSDLは、異なるトランスポートのメカニズムとスタイルを提供します。
  305. これは、WSDLのバインディング・セクションの範囲内で、
  306. <code>soap:binding</code>および<code>soap:body</code>タグに影響を及ぼします。
  307. クライアント毎に、本当に機能するオプションについて、それぞれの必要条件があります。
  308. したがって、自動検出クラスでどんな<code>setClass</code>や<code>addFunction</code>メソッドでも呼び出す前に、
  309. スタイルを設定できます。
  310. </para>
  311. <programlisting language="php"><![CDATA[
  312. $autodiscover = new Zend_Soap_AutoDiscover();
  313. // デフォルトは 'use' => 'encoded' 及び
  314. // 'encodingStyle' => 'http://schemas.xmlsoap.org/soap/encoding/' です。
  315. $autodiscover->setOperationBodyStyle(
  316. array('use' => 'literal',
  317. 'namespace' => 'http://framework.zend.com')
  318. );
  319. // デフォルトは 'style' => 'rpc' 及び
  320. // 'transport' => 'http://schemas.xmlsoap.org/soap/http' です。
  321. $autodiscover->setBindingStyle(
  322. array('style' => 'document',
  323. 'transport' => 'http://framework.zend.com')
  324. );
  325. ...
  326. $autodiscover->addFunction('myfunc1');
  327. $autodiscover->handle();
  328. ]]></programlisting>
  329. </sect2>
  330. </sect1>