Zend_Soap_AutoDiscovery.xml 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!-- EN-Revision: 24249 -->
  3. <!-- Reviewed: no -->
  4. <sect1 id="zend.soap.autodiscovery">
  5. <title>AutoDiscovery</title>
  6. <sect2 id="zend.soap.autodiscovery.introduction">
  7. <title>AutoDiscovery Einführung</title>
  8. <para>
  9. Die <acronym>SOAP</acronym> Funktionalität die im Zend Framework implementiert ist, ist
  10. dazu gedacht alle benötigten Schritte für die <acronym>SOAP</acronym> Kommunikation
  11. einfacher zu gestalten.
  12. </para>
  13. <para>
  14. <acronym>SOAP</acronym> ist ein von der Sprache unabhängiges Protokoll. Deshalb kann es
  15. nicht nur für <acronym>PHP</acronym>-zu-PHP Kommunikation verwendet werden.
  16. </para>
  17. <para>
  18. Es gibt drei Konfigurationen für <acronym>SOAP</acronym> Anwendungen wo Zend Framework
  19. verwendet werden kann:
  20. <orderedlist>
  21. <listitem>
  22. <simpara>
  23. SOAP Server <acronym>PHP</acronym> Anwendung &lt;---&gt;
  24. <acronym>SOAP</acronym> Client <acronym>PHP</acronym> Anwendung
  25. </simpara>
  26. </listitem>
  27. <listitem>
  28. <simpara>
  29. <acronym>SOAP</acronym> Server nicht-PHP Anwendung &lt;---&gt;
  30. <acronym>SOAP</acronym> Client <acronym>PHP</acronym> Anwendung
  31. </simpara>
  32. </listitem>
  33. <listitem>
  34. <simpara>
  35. SOAP Server <acronym>PHP</acronym> Anwendung &lt;---&gt;
  36. <acronym>SOAP</acronym> Client nicht-PHP Anwendung
  37. </simpara>
  38. </listitem>
  39. </orderedlist>
  40. </para>
  41. <para>
  42. Wir müssen immer wissen, welche Funktionalität vom <acronym>SOAP</acronym> Server
  43. angeboten wird um mit Ihm zu arbeiten. <ulink
  44. url="http://www.w3.org/TR/wsdl">WSDL</ulink> wird verwendet um die Netzwerk Service
  45. <acronym>API</acronym> im Detail zu beschreiben.
  46. </para>
  47. <para>
  48. Die WSDL Sprache ist komplex genug (siehe <ulink
  49. url="http://www.w3.org/TR/wsdl">http://www.w3.org/TR/wsdl</ulink> für die Details).
  50. Es ist also kompliziert genug die richtige WSDL Beschreibung vorzubereiten.
  51. </para>
  52. <para>
  53. Ein anderes Problem ist die Synchronisation von Änderungen in der Netzwerk Service
  54. <acronym>API</acronym> mit schon existierendem WSDL.
  55. </para>
  56. <para>
  57. Aber dieses Problem kann durch WSDL Autogeneration gelöst werden. Eine Vorbedingung
  58. dafür ist ein <acronym>SOAP</acronym> Server Autodiscovery. Es erzeugt ein Objekt
  59. ähnlich dem Objekt das in der <acronym>SOAP</acronym> Server Anwendung verwendet wird,
  60. extrahiert notwendige Informationen und erzeugt ein korrektes WSDL indem es die
  61. Information verwendet.
  62. </para>
  63. <para>
  64. Es gibt zwei Wege für die Verwendung des Zend Framworks für <acronym>SOAP</acronym>
  65. Server Anwendungen:
  66. <itemizedlist>
  67. <listitem>
  68. <para>Verwendung von eigenen Klassen.</para>
  69. </listitem>
  70. <listitem>
  71. <para>Verwendung eines Sets von Funktionen</para>
  72. </listitem>
  73. </itemizedlist>
  74. </para>
  75. <para>
  76. Beide Methoden werden von der Zend Framework Autodiscovery Funktionalität unterstützt.
  77. </para>
  78. <para>
  79. Die <classname>Zend_Soap_AutoDiscovery</classname> Klasse unterstützt auch das Mapping
  80. von Datentypen von <acronym>PHP</acronym> zu <ulink
  81. url="http://www.w3.org/TR/xmlschema-2/">XSD Typen</ulink>.
  82. </para>
  83. <para>
  84. Hier ist ein Beispiel einer üblichen Verwendung der Autodiscovery Funktionalität. Die
  85. Funktion <methodname>handle()</methodname> erzeugt die WSDL Datei und postet Sie an den
  86. Browser.
  87. </para>
  88. <programlisting language="php"><![CDATA[
  89. class My_SoapServer_Class {
  90. ...
  91. }
  92. $autodiscover = new Zend_Soap_AutoDiscover();
  93. $autodiscover->setClass('My_SoapServer_Class');
  94. $autodiscover->handle();
  95. ]]></programlisting>
  96. <para>
  97. Wenn man auf die erzeugte WSDL Datei zugreifen muß um Sie in eine Datei oder als
  98. <acronym>XML</acronym> String abzuspeichern, kann man die Funktionen
  99. <methodname>dump($filename)</methodname> oder <methodname>toXml()</methodname> verwenden
  100. welche die AutoDiscovery Klasse anbietet.
  101. </para>
  102. <note id="zend.soap.autodiscovery.introduction.noserver">
  103. <title>Zend_Soap_Autodiscover ist kein Soap Server</title>
  104. <para>
  105. Es ist wichtig anzumerken, das die Klasse
  106. <classname>Zend_Soap_Autodiscover</classname> nicht für sich selbst als
  107. <acronym>SOAP</acronym> Server agiert. Sie erzeugt nur den WSDL und bietet Ihn jedem
  108. an der auf die URL zugreift auf die geschaut wird.
  109. </para>
  110. <para>
  111. Als Endpunkt der <acronym>SOAP</acronym> URI verwendet es den Standard
  112. <code>'http://' .$_SERVER['HTTP_HOST'] . $_SERVER['SCRIPT_NAME']</code>, der aber
  113. mit der <methodname>setUri()</methodname> Funktion oder dem Contructor Parameter der
  114. <classname>Zend_Soap_AutoDiscover</classname> Klasse verändert werden kann. Der
  115. Endpunkt muß an einen <classname>Zend_Soap_Server</classname> übergeben werden der
  116. auf die Anfragen hört.
  117. </para>
  118. <programlisting language="php"><![CDATA[
  119. if(isset($_GET['wsdl'])) {
  120. $autodiscover = new Zend_Soap_AutoDiscover();
  121. $autodiscover->setClass('HelloWorldService');
  122. $autodiscover->handle();
  123. } else {
  124. // zeigt auf diese aktuelle Datei
  125. $soap = new Zend_Soap_Server("http://example.com/soap.php?wsdl");
  126. $soap->setClass('HelloWorldService');
  127. $soap->handle();
  128. }
  129. ]]></programlisting>
  130. </note>
  131. </sect2>
  132. <sect2 id="zend.soap.autodiscovery.class">
  133. <title>Automatische Erkennung von Klassen</title>
  134. <para>
  135. Wenn eine Klasse verwendet wird um SOAP Server Funktionalitäten anzubieten, dann sollte
  136. die selbe Klasse an <classname>Zend_Soap_AutoDiscover</classname> für die WSDL Erzeugung
  137. übergeben werden:
  138. </para>
  139. <programlisting language="php"><![CDATA[
  140. $autodiscover = new Zend_Soap_AutoDiscover();
  141. $autodiscover->setClass('My_SoapServer_Class');
  142. $autodiscover->handle();
  143. ]]></programlisting>
  144. <para>
  145. Die folgenden Regeln werden während der WSDL Erzeugung verwendet:
  146. <itemizedlist>
  147. <listitem>
  148. <para>Erzeugtes WSDL beschreibt einen RPC srtigen Web Service.</para>
  149. </listitem>
  150. <listitem>
  151. <para>
  152. Klassen Namen werden als Name des Web Services verwendet der beschrieben
  153. wird.
  154. </para>
  155. </listitem>
  156. <listitem>
  157. <para>
  158. <code>'http://' .$_SERVER['HTTP_HOST'] . $_SERVER['SCRIPT_NAME']</code>
  159. wird als <acronym>URI</acronym> verwendet wenn das WSDL standardmäßig
  160. vorhanden ist und kann über die <methodname>setUri()</methodname> Methode
  161. überschrieben werden.
  162. </para>
  163. <para>
  164. Es wird auch als Ziel Namespace für alle Service bezogenen Namen verwendet
  165. (inklusive der beschriebenen komplexen Typen).
  166. </para>
  167. </listitem>
  168. <listitem>
  169. <para>
  170. Klassen Methoden werden in einen <ulink
  171. url="http://www.w3.org/TR/wsdl#_porttypes">Port Typ</ulink> übernommen.
  172. </para>
  173. <para>
  174. <code>$className . 'Port'</code> wird als Port Typ Name verwendet.
  175. </para>
  176. </listitem>
  177. <listitem>
  178. <para>
  179. Jede Klassen Methode wird als korrespondierende Port Operation registriert.
  180. </para>
  181. </listitem>
  182. <listitem>
  183. <para>
  184. Jeder Methoden Prototyp erzeugt korrespondierende Anfrage/Antwort
  185. Nachrichten.
  186. </para>
  187. <para>
  188. Eine Methode kann verschiedene Prototypen haben wenn einige Parameter der
  189. Methode optional sind.
  190. </para>
  191. </listitem>
  192. </itemizedlist>
  193. </para>
  194. <note>
  195. <title>Wichtig!</title>
  196. <para>
  197. WSDL Autodiscovery verwendet <acronym>PHP</acronym> Docblocks die vom Entwickler
  198. angeboten werden um die Parameter und Return Typen zu erkennen. Faktisch ist das,
  199. für skalare Typen, der einzige Weg um die Parameter Typen zu erkennen und für Return
  200. Typen ist das der einzige Weg um Sie zu erkennen.
  201. </para>
  202. <para>
  203. Das bedeutet, das Anbieten von richtigen und komplett detailierten Docblocks ist
  204. nicht nur beste Praxis, sondern wird für das erkunden der Klasse benötigt.
  205. </para>
  206. </note>
  207. </sect2>
  208. <sect2 id="zend.soap.autodiscovery.functions">
  209. <title>Funktionen für Autodiscovery</title>
  210. <para>
  211. Wenn ein Set von Funktionen verwendet wird um SOAP Server Funktionalität anzubieten,
  212. dann sollte das selbe Set mit <classname>Zend_Soap_AutoDiscovery</classname> für die
  213. WSDL Erzeugung verwendet werden:
  214. </para>
  215. <programlisting language="php"><![CDATA[
  216. $autodiscover = new Zend_Soap_AutoDiscover();
  217. $autodiscover->addFunction('function1');
  218. $autodiscover->addFunction('function2');
  219. $autodiscover->addFunction('function3');
  220. ...
  221. $autodiscover->handle();
  222. ]]></programlisting>
  223. <para>
  224. Die folgenden Regeln werden während der WSDL Erzeugung verwendet:
  225. <itemizedlist>
  226. <listitem>
  227. <para>Ein erstelltes WSDL beschreibt einen RPC artigen Web Service.</para>
  228. </listitem>
  229. <listitem>
  230. <para>
  231. Der aktuelle Skriptname wird als Name des Web Services verwendet der
  232. beschrieben wird.
  233. </para>
  234. </listitem>
  235. <listitem>
  236. <para>
  237. <code>'http://' .$_SERVER['HTTP_HOST'] . $_SERVER['SCRIPT_NAME']</code>
  238. wird als <acronym>URI</acronym> verwendet wo WSDL vorhanden ist.
  239. </para>
  240. <para>
  241. Wird als Ziel Namespace für alle Service bezogenen Namen verwendet
  242. (inklusive der beschriebenen komplexen Typen).
  243. </para>
  244. </listitem>
  245. <listitem>
  246. <para>
  247. Funktionen werden in einem <ulink
  248. url="http://www.w3.org/TR/wsdl#_porttypes">Port Typ</ulink> verbunden.
  249. </para>
  250. <para>
  251. <code>$functionName . 'Port'</code> wird als Port Typ Name verwendet.
  252. </para>
  253. </listitem>
  254. <listitem>
  255. <para>
  256. Jede Funktion wird als korrespondierende Port Operation registriert.
  257. </para>
  258. </listitem>
  259. <listitem>
  260. <para>
  261. Jeder Funktions Prototyp erzeugt eine korrespondierende Anfrage/Antwort
  262. Nachricht.
  263. </para>
  264. <para>
  265. Funktionen können verschiedene Prototypen haben wenn einige Parameter der
  266. Methode optional sind.
  267. </para>
  268. </listitem>
  269. </itemizedlist>
  270. </para>
  271. <note>
  272. <title>Wichtig!</title>
  273. <para>
  274. WSDL Autodiscovery verwendet <acronym>PHP</acronym> Docblocks die vom Entwickler
  275. angeboten werden um die Parameter und Return Typen zu erkennen. Faktisch ist das,
  276. für skalare Typen, der einzige Weg um die Parameter Typen zu erkennen und für Return
  277. Typen ist das der einzige Weg um Sie zu erkennen.
  278. </para>
  279. <para>
  280. Das bedeutet, das Anbieten von richtigen und komplett detailierten Docblocks ist
  281. nicht nur beste Praxis, sondern wird für das erkunden der Klasse benötigt.
  282. </para>
  283. </note>
  284. </sect2>
  285. <sect2 id="zend.soap.autodiscovery.datatypes">
  286. <title>Automatische Erkennung. Datentypen</title>
  287. <para>
  288. Eingabe/Ausgabe Datentypen werden in Netzwerk Service Typen konvertiert indem das
  289. folgende Mapping verwendet wird:
  290. <itemizedlist>
  291. <listitem><para>PHP Strings &lt;-&gt; <code>xsd:string</code>.</para></listitem>
  292. <listitem><para>PHP Integer &lt;-&gt; <code>xsd:int</code>.</para></listitem>
  293. <listitem>
  294. <para>PHP Float und Double &lt;-&gt; <code>xsd:float</code>.</para>
  295. </listitem>
  296. <listitem><para>PHP Boolean &lt;-&gt; <code>xsd:boolean</code>.</para></listitem>
  297. <listitem><para>PHP Arrays &lt;-&gt; <code>soap-enc:Array</code>.</para></listitem>
  298. <listitem><para>PHP Objekt &lt;-&gt; <code>xsd:struct</code>.</para></listitem>
  299. <listitem>
  300. <para>
  301. <acronym>PHP</acronym> Klasse &lt;-&gt; basierend auf der Strategie der
  302. komplexen Typen (Siehe <link
  303. linkend="zend.soap.wsdl.types.add_complex">diesen Abschnitt</link>)
  304. <footnote>
  305. <para>
  306. <classname>Zend_Soap_AutoDiscover</classname> wird mit der
  307. <classname>Zend_Soap_Wsdl_Strategy_DefaultComplexType</classname>
  308. Klasse als Erkennungsalgorithmus für komplexe Typen erstellt. Der
  309. erste Parameter des AutoDiscover Constructors nimmt jede Strategie
  310. für komplexe Typen die
  311. <classname>Zend_Soap_Wsdl_Strategy_Interface</classname>
  312. implementieren oder einen String mit dem Nmaen der Klasse. Um
  313. Backwards Compatibility mit <varname>$extractComplexType</varname>
  314. zu gewährleisten werden boolsche Variablen wie in
  315. <classname>Zend_Soap_Wsdl</classname> geparst. Siehe das <link
  316. linkend="zend.soap.wsdl.types.add_complex"><classname>Zend_Soap_Wsdl</classname>
  317. Manual über das Hinzufügen von komplexen</link> Typen für
  318. weitere Informationen.
  319. </para>
  320. </footnote>.
  321. </para>
  322. </listitem>
  323. <listitem>
  324. <para>
  325. type[] oder object[] (z.B. int[]) &lt;-&gt; basieren auf der Strategie der
  326. komplexen Typen
  327. </para>
  328. </listitem>
  329. <listitem>
  330. <para>PHP Void &lt;-&gt; Leerer Typ.</para>
  331. </listitem>
  332. <listitem>
  333. <para>Wenn der Typ aus irgendeinem Grund keinem dieser Typen entspricht, dann
  334. wird <code>xsd:anyType</code> verwendet.</para>
  335. </listitem>
  336. </itemizedlist>
  337. Wo <code>xsd:</code> ein "http://www.w3.org/2001/XMLSchema" Namespace ist, ist
  338. <code>soap-enc:</code> ein "http://schemas.xmlsoap.org/soap/encoding/" Namespace, und
  339. <code>tns:</code> ist ein "Ziel Namespace" für einen Service.
  340. </para>
  341. </sect2>
  342. <sect2 id="zend.soap.autodiscovery.wsdlstyles">
  343. <title>Stile für das Binden von WSDL</title>
  344. <para>
  345. WSDL bietet verschiedene Transport Mechanismen und Stile. Das beeinträchtigt die
  346. <code>soap:binding</code> und <code>soap:body</code> Tags in der Binding Sektion von
  347. WSDL. Unterschiedliche Clients haben unterschiedliche Anforderungen wie diese Optionen
  348. wirklich arbeiten. Hierfür kann man die Stile setzen bevor man eine
  349. <code>setClass</code> oder <code>addFunction</code> Methode auf der AutoDiscovery Klasse
  350. ausführt.
  351. </para>
  352. <programlisting language="php"><![CDATA[
  353. $autodiscover = new Zend_Soap_AutoDiscover();
  354. // Standard ist 'use' => 'encoded' und
  355. // 'encodingStyle' => 'http://schemas.xmlsoap.org/soap/encoding/'
  356. $autodiscover->setOperationBodyStyle(
  357. array('use' => 'literal',
  358. 'namespace' => 'http://framework.zend.com')
  359. );
  360. // Standard ist 'style' => 'rpc' und
  361. // 'transport' => 'http://schemas.xmlsoap.org/soap/http'
  362. $autodiscover->setBindingStyle(
  363. array('style' => 'document',
  364. 'transport' => 'http://framework.zend.com')
  365. );
  366. ...
  367. $autodiscover->addFunction('myfunc1');
  368. $autodiscover->handle();
  369. ]]></programlisting>
  370. </sect2>
  371. </sect1>