Zend_Soap_AutoDiscovery.xml 17 KB

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