Zend_Controller-Plugins.xml 9.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <!-- EN-Revision: 24249 -->
  3. <!-- Reviewed: no -->
  4. <sect1 id="zend.controller.plugins" xmlns:xi="http://www.w3.org/2001/XInclude">
  5. <title>Plugins</title>
  6. <sect2 id="zend.controller.plugins.introduction">
  7. <title>Introduction</title>
  8. <para>
  9. L'architecture <acronym>MVC</acronym> de Zend Framework propose l'injection de plugins
  10. de code, qui vont intervenir à différents niveaux dans le processus complet. Le
  11. contrôleur frontal enregistre des plugins, et utilise un gestionnaire de plugins
  12. ("plugin broker"), qui va se charger de faire intervenir chaque plugin, à chacun des
  13. instants clés à votre disposition.
  14. </para>
  15. <para>
  16. Les instants clés sont des méthodes événementielles définies dans la classe
  17. abstraite <classname>Zend_Controller_Plugin_Abstract</classname>, dont tous les plugins
  18. doivent hériter&#160;:
  19. </para>
  20. <itemizedlist>
  21. <listitem>
  22. <para>
  23. <methodname>routeStartup()</methodname> est appelée avant que
  24. <classname>Zend_Controller_Front</classname> n'appelle
  25. <link linkend="zend.controller.router">le routeur</link> pour évaluer ses
  26. routes et remplir la requête.
  27. </para>
  28. </listitem>
  29. <listitem>
  30. <para>
  31. <methodname>routeShutdown()</methodname> est appelée après que
  32. <link linkend="zend.controller.router">le routeur</link> aie fini de router la
  33. requête.
  34. </para>
  35. </listitem>
  36. <listitem>
  37. <para>
  38. <methodname>dispatchLoopStartup()</methodname> est appelée juste avant que
  39. <classname>Zend_Controller_Front</classname> n'entre en boucle de
  40. distribution.
  41. </para>
  42. </listitem>
  43. <listitem>
  44. <para>
  45. <methodname>preDispatch()</methodname> est appelée avant qu'une action ne soit
  46. distribuée par
  47. <link linkend="zend.controller.dispatcher">le distributeur</link>. Cette
  48. méthode permet un filtrage ou un proxy. En jouant sur la requête à ce niveau
  49. là, vous êtes capable de changer le processus, et en vous aidant de
  50. <methodname>Zend_Controller_Request_Abstract::setDispatched(true)</methodname>),
  51. vous supprimez l'ordre de distribution de celle-ci.
  52. </para>
  53. </listitem>
  54. <listitem>
  55. <para>
  56. <methodname>postDispatch()</methodname> est appelée après qu'une action
  57. n'ait été distribuée par
  58. <link linkend="zend.controller.dispatcher">le distributeur</link>. Cette
  59. méthode permet un filtrage ou un proxy. En jouant sur la requête à ce niveau
  60. là, vous êtes capable de changer le processus, et en vous aidant de
  61. <methodname>Zend_Controller_Request_Abstract::setDispatched(false)</methodname>),
  62. vous ordonnez une redistribution de celle-ci.
  63. </para>
  64. </listitem>
  65. <listitem>
  66. <para>
  67. <methodname>dispatchLoopShutdown()</methodname> est appelée par
  68. <classname>Zend_Controller_Front</classname> lorsque celui-ci sort de la boucle
  69. de distribution.
  70. </para>
  71. </listitem>
  72. </itemizedlist>
  73. </sect2>
  74. <sect2 id="zend.controller.plugins.writing">
  75. <title>Écrire des plugins</title>
  76. <para>
  77. Tous les plugins doivent hériter de
  78. <classname>Zend_Controller_Plugin_Abstract</classname>:
  79. </para>
  80. <programlisting language="php"><![CDATA[
  81. class MyPlugin extends Zend_Controller_Plugin_Abstract
  82. {
  83. // ...
  84. }
  85. ]]></programlisting>
  86. <para>
  87. Comme aucune des méthodes de
  88. <classname>Zend_Controller_Plugin_Abstract</classname> n'est abstraite, vous n'êtes pas
  89. obligé dans vos plugins de toutes les définir. Vous agissez aux endroits que vous
  90. voulez.
  91. </para>
  92. <para>
  93. <classname>Zend_Controller_Plugin_Abstract</classname> vous donne aussi accès aux objets
  94. de réponse et de requête, dans vos plugins.<methodname>getRequest()</methodname> et
  95. <methodname>getResponse()</methodname> sont là pour ça. Cependant, l'objet de requête
  96. est de toute façon passé en paramètre à vos méthodes. Veillez à le récupérer dans la
  97. définition de vos méthodes sinon une erreur <constant>E_STRICT</constant> sera levée.
  98. </para>
  99. </sect2>
  100. <sect2 id="zend.controller.plugins.using">
  101. <title>Utilisation des plugins</title>
  102. <para>
  103. Les plugins sont enregistrés avec
  104. <methodname>Zend_Controller_Front::registerPlugin()</methodname>, et peuvent l'être
  105. n'importe quand. Voici un exemple&#160;:
  106. </para>
  107. <programlisting language="php"><![CDATA[
  108. class MyPlugin extends Zend_Controller_Plugin_Abstract
  109. {
  110. public function routeStartup(
  111. Zend_Controller_Request_Abstract $request)
  112. {
  113. $this->getResponse()
  114. ->appendBody("<p>routeStartup() appelée</p>\n");
  115. }
  116. public function routeShutdown(
  117. Zend_Controller_Request_Abstract $request)
  118. {
  119. $this->getResponse()
  120. ->appendBody("<p>routeShutdown() appelée</p>\n");
  121. }
  122. public function dispatchLoopStartup(
  123. Zend_Controller_Request_Abstract $request)
  124. {
  125. $this->getResponse()
  126. ->appendBody("<p>dispatchLoopStartup() appelée</p>\n");
  127. }
  128. public function preDispatch(
  129. Zend_Controller_Request_Abstract $request)
  130. {
  131. $this->getResponse()
  132. ->appendBody("<p>preDispatch() appelée</p>\n");
  133. }
  134. public function postDispatch(
  135. Zend_Controller_Request_Abstract $request)
  136. {
  137. $this->getResponse()
  138. ->appendBody("<p>postDispatch() appelée</p>\n");
  139. }
  140. public function dispatchLoopShutdown()
  141. {
  142. $this->getResponse()
  143. ->appendBody("<p>dispatchLoopShutdown() appelée</p>\n");
  144. }
  145. }
  146. $front = Zend_Controller_Front::getInstance();
  147. $front->setControllerDirectory('/path/to/controllers')
  148. ->setRouter(new Zend_Controller_Router_Rewrite())
  149. ->registerPlugin(new MyPlugin());
  150. $front->dispatch();
  151. ]]></programlisting>
  152. <para>
  153. Si aucune autre action ne génère une sortie (typiquement, un rendu de vue), alors
  154. le résultat suivant devrait s'afficher&#160;:
  155. </para>
  156. <programlisting language="php"><![CDATA[
  157. <p>routeStartup() appelée</p>
  158. <p>routeShutdown() appelée</p>
  159. <p>dispatchLoopStartup() appelée</p>
  160. <p>preDispatch() appelée</p>
  161. <p>postDispatch() appelée</p>
  162. <p>dispatchLoopShutdown() appelée</p>
  163. ]]></programlisting>
  164. <note>
  165. <para>
  166. Enregistrez vos plugins où vous voulez dans votre code, mais faites attention
  167. de ne pas leur faire sauter de méthodes, selon l'endroit où vous les
  168. enregistrez.
  169. </para>
  170. </note>
  171. </sect2>
  172. <sect2 id="zend.controller.plugins.manipulating">
  173. <title>Récupération et manipulations des plugins</title>
  174. <para>
  175. Il peut arriver que vous ayez besoin de récupérer des plugins, ou d'en supprimer.
  176. Les méthodes suivantes vous seront alors utiles&#160;:
  177. </para>
  178. <itemizedlist>
  179. <listitem>
  180. <para>
  181. <methodname>getPlugin($class)</methodname> vous retourne l'objet de plugin
  182. correspondant à la chaîne passée en paramètre. Si il n'y a pas de
  183. correspondance, <constant>FALSE</constant> est retourné. Un tableau est
  184. retourné s'il y a plusieurs plugins de cette classe.
  185. </para>
  186. </listitem>
  187. <listitem>
  188. <para>
  189. <methodname>getPlugins()</methodname> retourne toute la pile de plugins.
  190. </para>
  191. </listitem>
  192. <listitem>
  193. <para>
  194. <methodname>unregisterPlugin($plugin)</methodname> supprime un plugin du
  195. processus. Passez un nom de classe, et tous les plugins de cette classe
  196. seront alors enlevés de la pile. Vous pouvez aussi passer un objet.
  197. </para>
  198. </listitem>
  199. </itemizedlist>
  200. </sect2>
  201. <sect2 id="zend.controller.plugins.standard">
  202. <title>Plugins inclus dans Zend Framework</title>
  203. <para>Zend Framework possède des plugins dans sa distribution&#160;:</para>
  204. <xi:include href="Zend_Controller-Plugins-ActionStack.xml" />
  205. <xi:include href="Zend_Controller-Plugins-ErrorHandler.xml" />
  206. <xi:include href="Zend_Controller-Plugins-PutHandler.xml" />
  207. </sect2>
  208. </sect1>