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