Zend_Soap_AutoDiscovery.xml 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <!-- EN-Revision: 14094 -->
  3. <!-- Reviewed: no -->
  4. <sect1 id="zend.soap.autodiscovery">
  5. <title>Auto découverte</title>
  6. <sect2 id="zend.soap.autodiscovery.introduction">
  7. <title>Introduction à l'auto découverte</title>
  8. <para>Les fonctionnalités SOAP de Zend Framework sont proposées afin de simplifier l'accès aux services Web de
  9. type SOAP.</para>
  10. <para>SOAP est un protocole d'échange de données indépendant d'un langage. Il peut donc être utilisé avec une
  11. autre technologie que PHP.</para>
  12. <para>Il y a trois configurations d'utilisation de SOAP avec Zend Framework :<orderedlist>
  13. <listitem>
  14. <simpara>SOAP serveur application PHP &lt;---&gt; SOAP client application PHP</simpara>
  15. </listitem>
  16. <listitem>
  17. <simpara>SOAP serveur application non PHP &lt;---&gt; SOAP client application PHP</simpara>
  18. </listitem>
  19. <listitem>
  20. <simpara>SOAP serveur application PHP &lt;---&gt; SOAP client application non PHP</simpara>
  21. </listitem>
  22. </orderedlist></para>
  23. <para>Il est indispensable de connaître les fonctionnalités qu'offre un serveur SOAP, afin de pouvoir
  24. communiquer avec lui. <ulink url="http://www.w3.org/TR/wsdl">WSDL</ulink> est alors utilisé pour décrire en
  25. détail l'API des services disponibles sur un serveur SOAP.</para>
  26. <para>Le langage WSDL est assez complexe (voyez <ulink
  27. url="http://www.w3.org/TR/wsdl">http://www.w3.org/TR/wsdl</ulink> pour les détails ). Il est donc difficile
  28. d'écrire une définition WSDL correcte, à la main.</para>
  29. <para>Un autre problème concerne la synchronisation des changements dans l'API avec des fichiers WSDL déjà
  30. existants.</para>
  31. <para>Ces 2 problèmes peuvent être résolus avec la génération automatique de WSDL, qui permet d'analyser une
  32. classe ou des fonctions, d'en extraire les paramètres d'entrée/sortie, et de générer un fichier WSDL correct et
  33. compréhensible par le serveur et les clients SOAP.</para>
  34. <para>Il y a deux façons d'utiliser Zend Framework pour une application serveur SOAP: <itemizedlist>
  35. <listitem>
  36. <para>Utiliser des classes.</para>
  37. </listitem>
  38. <listitem>
  39. <para>Utiliser des fonctions.</para>
  40. </listitem>
  41. </itemizedlist></para>
  42. <para>Ces deux façons sont supportées par la fonctionnalité d'auto génération de Zend Framework.</para>
  43. <para>Zend_Soap_AutoDiscovery supporte aussi la correspondance des types PHP vers <ulink
  44. url="http://www.w3.org/TR/xmlschema-2/">les types XSD</ulink>.</para>
  45. <para>Voici un exemple d'utilisation de l'auto découverte. La fonction <code>handle()</code> génère le fichier
  46. WSDL et l'envoie au navigateur : <programlisting role="php"><![CDATA[
  47. class My_SoapServer_Class {
  48. ...
  49. }
  50. $autodiscover = new Zend_Soap_AutoDiscover();
  51. $autodiscover->setClass('My_SoapServer_Class');
  52. $autodiscover->handle();
  53. ]]></programlisting></para>
  54. <para>Si vous avez besoin d'accéder au fichier WSDL généré soit pour le sauvegarder dans un fichier ou en tant
  55. que chaîne de caractères, vous pouvez utiliser les méthodes <code>dump($filename)</code> ou <code>toXml()</code>
  56. que la classe AutoDiscover fournit.</para>
  57. <note id="zend.soap.autodiscovery.introduction.noserver">
  58. <title>Zend_Soap_Autodiscover n'est pas un serveur SOAP</title>
  59. <para>Il est très important de noter, que la classe <classname>Zend_Soap_Autodiscover</classname> n'agit pas en tant
  60. que serveur SOAP elle-même. Elle génère seulement le WSDL et le fournit à ceux qui accèdent à l'URL qu'elle
  61. écoute.</para>
  62. <para>Par défaut l'URI de SOAP est <code>'http://' .$_SERVER['HTTP_HOST'] . $_SERVER['SCRIPT_NAME']</code>,
  63. mais ceci peut être changé avec la méthode <code>setUri()</code> ou le paramètre de constructeur de la
  64. classe <classname>Zend_Soap_AutoDiscover</classname>. L'URI doit correspondre à un <classname>Zend_Soap_Server</classname> qui
  65. écoute les requêtes.</para>
  66. <para><programlisting role="php"><![CDATA[
  67. if(isset($_GET['wsdl'])) {
  68. $autodiscover = new Zend_Soap_AutoDiscover();
  69. $autodiscover->setClass('HelloWorldService');
  70. $autodiscover->handle();
  71. } else {
  72. // pointing to the current file here
  73. $soap = new Zend_Soap_Server("http://example.com/soap.php?wsdl");
  74. $soap->setClass('HelloWorldService');
  75. $soap->handle();
  76. }
  77. ]]></programlisting></para>
  78. </note>
  79. </sect2>
  80. <sect2 id="zend.soap.autodiscovery.class">
  81. <title>Auto découverte de classe</title>
  82. <para>Si une classe est utilisée dans un serveur SOAP, alors celle-ci devrait aussi être fournie à
  83. <classname>Zend_Soap_AutoDiscovery</classname> afin d'en générer le fichier WSDL : <programlisting role="php"><![CDATA[
  84. $autodiscover = new Zend_Soap_AutoDiscover();
  85. $autodiscover->setClass('My_SoapServer_Class');
  86. $autodiscover->handle();
  87. ]]></programlisting></para>
  88. <para>Les règles suivantes sont utilisées lors de la génération du fichier WSDL : <itemizedlist>
  89. <listitem>
  90. <para>Le fichier WSDL généré décrit un service Web de type RPC.</para>
  91. </listitem>
  92. <listitem>
  93. <para>Le nom du service crée sera le nom de la classe utilisée.</para>
  94. </listitem>
  95. <listitem>
  96. <para><code>'http://' .$_SERVER['HTTP_HOST'] . $_SERVER['SCRIPT_NAME']</code> est utilisé comme URI
  97. où le fichier WSDL est disponible par défaut mais ceci peut être surchargé avec la méthode
  98. <code>setUri()</code>.</para>
  99. <para>Cet URI est aussi utilisé comme un espace de nom cible pour tous les noms du service (incluant
  100. les types complexes décrits éventuellement).</para>
  101. </listitem>
  102. <listitem>
  103. <para>Les méthodes de la classe sont jointes dans un <ulink
  104. url="http://www.w3.org/TR/wsdl#_porttypes">Port Type</ulink>.</para>
  105. <para><code>$className . 'Port'</code> est utilisé comme nom de Port Type.</para>
  106. </listitem>
  107. <listitem>
  108. <para>Chaque méthode de la classe est enregistrée comme une opération.</para>
  109. </listitem>
  110. <listitem>
  111. <para>Chaque prototype de méthode génère des messages de requête/réponse correspondants.</para>
  112. <para>Une méthode peut avoir plusieurs prototypes si des paramètres sont optionnels.</para>
  113. </listitem>
  114. </itemizedlist></para>
  115. <note>
  116. <title>Important !</title>
  117. <para>L'auto génération du fichier WSDL (avec auto découverte de la classe) utilise les blocs de
  118. documentation de PHP insérés par le développeur dans ses classes, afin de trouver les types retournés. De ce
  119. fait, pour les types scalaires, c'est le seul moyen de les déterminer de manière sûre, et concernant les
  120. types de retour des méthodes, c'est le seul moyen de les découvrir (PHP étant faiblement typé).</para>
  121. <para>Ceci signifie que documenter de manière correcte vos classes et méthodes n'est pas seulement une bonne
  122. pratique, c'est tout simplement essentiel pour partager vos classes en tant que services SOAP auto
  123. générés.</para>
  124. </note>
  125. </sect2>
  126. <sect2 id="zend.soap.autodiscovery.functions">
  127. <title>Auto découverte des fonctions</title>
  128. <para>Si des fonctions doivent être utilisées (partagées) via un serveur SOAP, alors elles doivent être passées
  129. à <classname>Zend_Soap_AutoDiscovery</classname> pour générer un fichier WSDL : <programlisting role="php"><![CDATA[
  130. $autodiscover = new Zend_Soap_AutoDiscover();
  131. $autodiscover->addFunction('function1');
  132. $autodiscover->addFunction('function2');
  133. $autodiscover->addFunction('function3');
  134. ...
  135. $autodiscover->handle();
  136. ]]></programlisting></para>
  137. <para>Les règles suivantes sont utilisées lors de la génération du fichier WSDL : <itemizedlist>
  138. <listitem>
  139. <para>Le fichier WSDL généré décrit un service web de type RPC.</para>
  140. </listitem>
  141. <listitem>
  142. <para>Le nom du service crée sera le nom du script analysé (utilisé).</para>
  143. </listitem>
  144. <listitem>
  145. <para><code>'http://' .$_SERVER['HTTP_HOST'] . $_SERVER['SCRIPT_NAME']</code> est utilisé comme URI
  146. pour rechercher le fichier WSDL.</para>
  147. <para>Cet URI est aussi utilisé comme un espace de nom cible pour tous les noms du service (incluant
  148. les types complexes décrits éventuellement).</para>
  149. </listitem>
  150. <listitem>
  151. <para>Les fonctions sont encapsulées dans un <ulink url="http://www.w3.org/TR/wsdl#_porttypes">Port
  152. Type</ulink>.</para>
  153. <para><code>$functionName . 'Port'</code> est utilisé comme nom de Port Type.</para>
  154. </listitem>
  155. <listitem>
  156. <para>Chaque fonction est enregistrée comme opération possible.</para>
  157. </listitem>
  158. <listitem>
  159. <para>Chaque prototype de fonction génère des messages de requête/réponse correspondants.</para>
  160. <para>Une fonction peut avoir plusieurs prototypes si des paramètres sont optionnels.</para>
  161. </listitem>
  162. </itemizedlist></para>
  163. <note>
  164. <title>Important!</title>
  165. <para>L'auto génération du fichier WSDL (avec auto découverte des fonctions) utilise les blocs de
  166. documentation de PHP insérés par le développeur dans ses fonctions, afin de trouver les types retournés. De
  167. ce fait, pour les types scalaires, c'est le seul moyen de les déterminer de manière sûre, et concernant les
  168. types de retour des méthodes, c'est le seul moyen de les découvrir (PHP étant faiblement typé).</para>
  169. <para>Ceci signifie que documenter de manière correcte vos fonctions n'est pas seulement une bonne pratique,
  170. c'est tout simplement essentiel pour partager vos fonctions en tant que services SOAP auto générés.</para>
  171. </note>
  172. </sect2>
  173. <sect2 id="zend.soap.autodiscovery.datatypes">
  174. <title>Types de donnée auto découverts</title>
  175. <para>Les types de données d'entrée/sortie sont convertis en types spéciaux pour le réseau, suivant ces règles :
  176. <itemizedlist>
  177. <listitem>
  178. <para>Chaînes strings &lt;-&gt; <code>xsd:string</code>.</para>
  179. </listitem>
  180. <listitem>
  181. <para>Entiers PHP &lt;-&gt; <code>xsd:int</code>.</para>
  182. </listitem>
  183. <listitem>
  184. <para>Flottants PHP (décimaux) &lt;-&gt; <code>xsd:float</code>.</para>
  185. </listitem>
  186. <listitem>
  187. <para>Booléens PHP &lt;-&gt; <code>xsd:boolean</code>.</para>
  188. </listitem>
  189. <listitem>
  190. <para>Tableaux PHP &lt;-&gt; <code>soap-enc:Array</code>.</para>
  191. </listitem>
  192. <listitem>
  193. <para>Objets PHP &lt;-&gt; <code>xsd:struct</code>.</para>
  194. </listitem>
  195. <listitem>
  196. <para>Classe PHP &lt;-&gt; basé sur la stratégie des types complexes (Voir : <xref
  197. linkend="zend.soap.wsdl.types.add_complex" />) <footnote>
  198. <para><classname>Zend_Soap_AutoDiscover</classname> sera créé avec la classe
  199. <classname>Zend_Soap_Wsdl_Strategy_DefaultComplexType</classname> en tant qu'algorithme de détection
  200. pour les types complexes. Le premier paramètre du constructeur AutoDiscover accepte toute
  201. stratégie de types complexes implémentant <classname>Zend_Soap_Wsdl_Strategy_Interface</classname> ou
  202. une chaîne correspondant au nom de la classe. Pour une compatibilité ascendante, avec
  203. <code>$extractComplexType</code> les variables booléennes sont analysées comme avec
  204. Zend_Soap_Wsdl. Regardez le manuel <link
  205. linkend="zend.soap.wsdl.types.add_complex">Zend_Soap_Wsdl sur l'ajout des types
  206. complexes</link> pour plus d'informations.</para>
  207. </footnote>.</para>
  208. </listitem>
  209. <listitem>
  210. <para><code>type[]</code> or <code>object[]</code> (c'est-à-dire <code>int[]</code>) &lt;-&gt; basé
  211. sur la stratégie des types complexes</para>
  212. </listitem>
  213. <listitem>
  214. <para>Void PHP &lt;-&gt; type vide.</para>
  215. </listitem>
  216. <listitem>
  217. <para>Si le type n'est pas reconnu en tant que l'un de ceux-ci, alors <code>xsd:anyType</code> est
  218. utilisé.</para>
  219. </listitem>
  220. </itemizedlist> Où <code>xsd:</code> est l'espace "http://www.w3.org/2001/XMLSchema", <code>soap-enc:</code>
  221. est l'espace "http://schemas.xmlsoap.org/soap/encoding/", <code>tns:</code> est "l'espace de nom cible" du
  222. service.</para>
  223. </sect2>
  224. <sect2 id="zend.soap.autodiscovery.wsdlstyles">
  225. <title>Styles de liaisons WSDL</title>
  226. <para>
  227. WSDL offre différents mécanismes et styles de transport. Ceci affecte les balises <code>soap:binding</code>
  228. et <code>soap:body</code> à l'intérieur de la section binding du WSDL. Différents clients ont différentes
  229. conditions quant aux options qui sont vraiment utilisées. Par conséquent vous pouvez placer les styles
  230. avant d'appeler n'importe quelle méthode <code>setClass</code> ou <code>addFunction</code> de la classe
  231. <code>AutoDiscover</code>.
  232. </para>
  233. <para>
  234. <programlisting role="php"><![CDATA[
  235. $autodiscover = new Zend_Soap_AutoDiscover();
  236. // Par défaut il s'agit de 'use' => 'encoded'
  237. // et 'encodingStyle' => 'http://schemas.xmlsoap.org/soap/encoding/'
  238. $autodiscover->setOperationBodyStyle(array('use' => 'literal', 'namespace' => 'http://framework.zend.com'));
  239. // Par défaut il s'agit de 'style' => 'rpc'
  240. // et 'transport' => 'http://schemas.xmlsoap.org/soap/http'
  241. $autodiscover->setBindingStyle(array('style' => 'document', 'transport' => 'http://framework.zend.com'));
  242. ...
  243. $autodiscover->addFunction('myfunc1');
  244. $autodiscover->handle();
  245. ]]>
  246. </programlisting>
  247. </para>
  248. </sect2>
  249. </sect1>