Zend_Soap_AutoDiscovery.xml 16 KB

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