Zend_Soap_AutoDiscovery.xml 18 KB

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