Zend_Soap_AutoDiscovery.xml 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!-- Reviewed: no -->
  3. <!-- EN-Revision: 17175 -->
  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. <programlisting language="php"><![CDATA[
  73. class My_SoapServer_Class {
  74. ...
  75. }
  76. $autodiscover = new Zend_Soap_AutoDiscover();
  77. $autodiscover->setClass('My_SoapServer_Class');
  78. $autodiscover->handle();
  79. ]]></programlisting>
  80. </para>
  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. <para>
  102. <programlisting language="php"><![CDATA[
  103. if(isset($_GET['wsdl'])) {
  104. $autodiscover = new Zend_Soap_AutoDiscover();
  105. $autodiscover->setClass('HelloWorldService');
  106. $autodiscover->handle();
  107. } else {
  108. //ここで現行ファイルを指示します。
  109. $soap = new Zend_Soap_Server("http://example.com/soap.php?wsdl");
  110. $soap->setClass('HelloWorldService');
  111. $soap->handle();
  112. }
  113. ]]></programlisting>
  114. </para>
  115. </note>
  116. </sect2>
  117. <sect2 id="zend.soap.autodiscovery.class">
  118. <title>クラスの自動検出</title>
  119. <para>
  120. クラスが<acronym>SOAP</acronym>サーバー機能を提供することに使われるならば、
  121. 同じクラスはWSDL生成のために<classname>Zend_Soap_AutoDiscover</classname>に提供されなければなりません:
  122. <programlisting language="php"><![CDATA[
  123. $autodiscover = new Zend_Soap_AutoDiscover();
  124. $autodiscover->setClass('My_SoapServer_Class');
  125. $autodiscover->handle();
  126. ]]></programlisting>
  127. </para>
  128. <para>
  129. WSDL生成の間、以下の規則が使われます:
  130. <itemizedlist>
  131. <listitem>
  132. <para>生成されたWSDLは、RPCスタイルのウェブサービスを記述します。</para>
  133. </listitem>
  134. <listitem>
  135. <para>クラス名が、記述されているウェブサービスの名前として使われます。</para>
  136. </listitem>
  137. <listitem>
  138. <para>
  139. <code>'http://' .$_SERVER['HTTP_HOST'] . $_SERVER['SCRIPT_NAME']</code>が
  140. WSDLをデフォルトで利用できる<acronym>URI</acronym>として使われます、
  141. しかし、それは<methodname>setUri()</methodname>メソッドによって上書きすることができます。
  142. </para>
  143. <para>
  144. それは、名前(記述された複雑な型を含む)に関連したすべてのサービスのための
  145. ターゲット名前空間としても使われます。
  146. </para>
  147. </listitem>
  148. <listitem>
  149. <para>
  150. クラス・メソッドは、1つの<ulink url="http://www.w3.org/TR/wsdl#_porttypes">ポートタイプ</ulink>に
  151. 結び付けられます。
  152. </para>
  153. <para>
  154. <code>$className . 'Port'</code>はポートタイプ名として使われます。
  155. </para>
  156. </listitem>
  157. <listitem>
  158. <para>各々のクラス・メソッドは、対応するポート操作として登録されます。</para>
  159. </listitem>
  160. <listitem>
  161. <para>各々のメソッド・プロトタイプは、対応するリクエスト/レスポンスメッセージを生成します。</para>
  162. <para>いくつかのメソッド・パラメータがオプションならば、
  163. メソッドはいくつかのプロトタイプを持つかもしれません。</para>
  164. </listitem>
  165. </itemizedlist>
  166. </para>
  167. <note>
  168. <title>重要!</title>
  169. <para>
  170. WSDL自動検出では、パラメータを決定して型を返すために、
  171. 開発者により提供される<acronym>PHP</acronym> docblockを利用します。
  172. 実際、スカラー型にとっては、パラメータ型を決定する唯一の方法です。
  173. そして、戻り型にとっては、それらを決定する唯一の方法です。
  174. </para>
  175. <para>
  176. つまり、正しくて詳細で完全なdocblockを提供することは習慣というだけではなく、
  177. 発見するクラスのために必要です。
  178. </para>
  179. </note>
  180. </sect2>
  181. <sect2 id="zend.soap.autodiscovery.functions">
  182. <title>関数の自動検出</title>
  183. <para>
  184. 関数のセットが<acronym>SOAP</acronym>サーバー機能を提供することに使われるならば、
  185. 同じセットはWSDL生成のために<classname>Zend_Soap_AutoDiscovery</classname>に提供されなければなりません:
  186. <programlisting language="php"><![CDATA[
  187. $autodiscover = new Zend_Soap_AutoDiscover();
  188. $autodiscover->addFunction('function1');
  189. $autodiscover->addFunction('function2');
  190. $autodiscover->addFunction('function3');
  191. ...
  192. $autodiscover->handle();
  193. ]]></programlisting>
  194. </para>
  195. <para>
  196. WSDL生成の間、以下の規則が使われます:
  197. <itemizedlist>
  198. <listitem>
  199. <para>生成されたWSDLは、RPCスタイルのウェブサービスを記述します。</para>
  200. </listitem>
  201. <listitem>
  202. <para>現在のスクリプト名が、記述されているウェブサービスの名前として使われます。</para>
  203. </listitem>
  204. <listitem>
  205. <para>
  206. <code>'http://' .$_SERVER['HTTP_HOST'] . $_SERVER['SCRIPT_NAME']</code>が
  207. WSDLを利用できる<acronym>URI</acronym>として使われます。
  208. </para>
  209. <para>
  210. それは、名前(記述された複雑な型を含む)に関連したすべてのサービスのための
  211. ターゲット名前空間としても使われます。
  212. </para>
  213. </listitem>
  214. <listitem>
  215. <para>
  216. 関数は、1つの<ulink url="http://www.w3.org/TR/wsdl#_porttypes">ポートタイプ</ulink>に
  217. 結び付けられます。
  218. </para>
  219. <para>
  220. <code>$functionName . 'Port'</code>はポートタイプ名として使われます。
  221. </para>
  222. </listitem>
  223. <listitem>
  224. <para>各々の関数は、対応するポート操作として登録されます。</para>
  225. </listitem>
  226. <listitem>
  227. <para>各々の関数プロトタイプは、対応するリクエスト/レスポンスメッセージを生成します。</para>
  228. <para>いくつかのメソッド・パラメータがオプションなら、
  229. 関数はいくつかのプロトタイプを持つかもしれません。</para>
  230. </listitem>
  231. </itemizedlist>
  232. </para>
  233. <note>
  234. <title>重要!</title>
  235. <para>
  236. WSDL自動検出では、パラメータを決定して、型を返すために、
  237. 開発者により提供される<acronym>PHP</acronym> docblockを利用します。
  238. 実際、スカラー型にとっては、パラメータ型を決定する唯一の方法です。
  239. そして、戻り型にとっては、それらを決定する唯一の方法です。
  240. </para>
  241. <para>
  242. つまり、正しくて詳細で完全なdocblockを提供することは習慣というだけではなく、
  243. 発見するクラスのために必要です。
  244. </para>
  245. </note>
  246. </sect2>
  247. <sect2 id="zend.soap.autodiscovery.datatypes">
  248. <title>データ型の自動検出</title>
  249. <para>
  250. 入出力データ型は、以下のマッピングを用いて、ネットワーク・サービス型に変換されます:
  251. <itemizedlist>
  252. <listitem>
  253. <para><acronym>PHP</acronym>文字列 &lt;-&gt; <code>xsd:string</code></para>
  254. </listitem>
  255. <listitem>
  256. <para><acronym>PHP</acronym> integer &lt;-&gt; <code>xsd:int</code></para>
  257. </listitem>
  258. <listitem>
  259. <para><acronym>PHP</acronym> floatおよびdouble値 &lt;-&gt; <code>xsd:float</code></para>
  260. </listitem>
  261. <listitem>
  262. <para><acronym>PHP</acronym>ブール値 &lt;-&gt; <code>xsd:boolean</code></para>
  263. </listitem>
  264. <listitem>
  265. <para><acronym>PHP</acronym>配列 &lt;-&gt; <code>soap-enc:Array</code></para>
  266. </listitem>
  267. <listitem>
  268. <para><acronym>PHP</acronym>オブジェクト &lt;-&gt; <code>xsd:struct</code></para>
  269. </listitem>
  270. <listitem>
  271. <para>
  272. <acronym>PHP</acronym>クラス &lt;-&gt; 複雑な型のストラテジーに基づいた (<xref linkend="zend.soap.wsdl.types.add_complex" />参照)
  273. <footnote>
  274. <para>
  275. <classname>Zend_Soap_AutoDiscover</classname>は複雑な型のための検出アルゴリズムとして
  276. <classname>Zend_Soap_Wsdl_Strategy_DefaultComplexType</classname>クラスで生成されます。
  277. AutoDiscoverコンストラクタの最初のパラメータは、
  278. <classname>Zend_Soap_Wsdl_Strategy_Interface</classname>を実装した、
  279. どんな複雑な型ストラテジーでも、クラスの名前を持つ文字列でもとります。
  280. <code>$extractComplexType</code>との後方互換性のために、
  281. ブール変数は<classname>Zend_Soap_Wsdl</classname>のように解析されます。
  282. 詳しくは<link linkend="zend.soap.wsdl.types.add_complex">複雑な型を追加することについて
  283. <classname>Zend_Soap_Wsdl</classname>マニュアル</link>をご覧下さい。
  284. </para>
  285. </footnote>
  286. </para>
  287. </listitem>
  288. <listitem>
  289. <para>type[] または object[] (例えば int[]) &lt;-&gt; 複雑な型のストラテジーに基づいた</para>
  290. </listitem>
  291. <listitem>
  292. <para><acronym>PHP</acronym> void &lt;-&gt; 空の型</para>
  293. </listitem>
  294. <listitem>
  295. <para>なんらかの理由でこれらの型のいずれとも型が一致しなければ、<code>xsd:anyType</code>が使われます。</para>
  296. </listitem>
  297. </itemizedlist>
  298. <code>xsd:</code> が "http://www.w3.org/2001/XMLSchema" ネームスペースであるところでは、
  299. <code>soap-enc:</code> は "http://schemas.xmlsoap.org/soap/encoding/" ネームスペースで、
  300. <code>tns:</code> はサービスのための "target namespace" です。
  301. </para>
  302. </sect2>
  303. <sect2 id="zend.soap.autodiscovery.wsdlstyles">
  304. <title>WSDLバインディングスタイル</title>
  305. <para>
  306. WSDLは、異なるトランスポートのメカニズムとスタイルを提供します。
  307. これは、WSDLのバインディング・セクションの範囲内で、
  308. <code>soap:binding</code>および<code>soap:body</code>タグに影響を及ぼします。
  309. クライアント毎に、本当に機能するオプションについて、それぞれの必要条件があります。
  310. したがって、自動検出クラスでどんな<code>setClass</code>や<code>addFunction</code>メソッドでも呼び出す前に、
  311. スタイルを設定することができます。
  312. </para>
  313. <para>
  314. <programlisting language="php"><![CDATA[
  315. $autodiscover = new Zend_Soap_AutoDiscover();
  316. // デフォルトは 'use' => 'encoded' 及び
  317. // 'encodingStyle' => 'http://schemas.xmlsoap.org/soap/encoding/' です。
  318. $autodiscover->setOperationBodyStyle(
  319. array('use' => 'literal',
  320. 'namespace' => 'http://framework.zend.com')
  321. );
  322. // デフォルトは 'style' => 'rpc' 及び
  323. // 'transport' => 'http://schemas.xmlsoap.org/soap/http' です。
  324. $autodiscover->setBindingStyle(
  325. array('style' => 'document',
  326. 'transport' => 'http://framework.zend.com')
  327. );
  328. ...
  329. $autodiscover->addFunction('myfunc1');
  330. $autodiscover->handle();
  331. ]]></programlisting>
  332. </para>
  333. </sect2>
  334. </sect1>