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 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320
|
<?xml version="1.0" encoding="utf-8"?>
<!-- EN-Revision: 24249 -->
<!-- Reviewed: no -->
<sect3 id="zend.controller.plugins.standard.errorhandler">
<title>Zend_Controller_Plugin_ErrorHandler</title>
<para>
<classname>Zend_Controller_Plugin_ErrorHandler</classname> est un plugin intégré par défaut
pour gérer les exceptions levées par votre application, il sert à gérer les exceptions
envoyées par l'application, en particulier celles concernant des contrôleurs ou des actions
manquants. C'est une manière rejoignant la section
<link linkend="zend.controller.exceptions">Exceptions MVC</link>.
</para>
<para>Les principaux objectifs de ce plugin sont :</para>
<itemizedlist>
<listitem>
<para>Intercepter les exceptions envoyées si aucune route ne correspond</para>
</listitem>
<listitem>
<para>
Intercepter les exceptions envoyées si un contrôleur ou une action ne peuvent
être trouvés
</para>
</listitem>
<listitem>
<para>Intercepte les exceptions envoyées dans les contrôleurs</para>
</listitem>
</itemizedlist>
<para>
Globalement, <emphasis>ErrorHandler</emphasis> sert à gérer les erreurs
<acronym>HTTP</acronym> 404 ou 500. Attention, le plugin n'est pas destiné à intervenir sur
les exceptions envoyées dans d'autres plugins. Des effets de bords peuvent apparaître,
veillez à les gérer.
</para>
<para>
Par défaut, <classname>Zend_Controller_Plugin_ErrorHandler</classname> redirige vers
<methodname>ErrorController::errorAction()</methodname> dans le module par défaut. Vous
pouvez passer d'autres valeurs via les accesseurs du plugin :
</para>
<itemizedlist>
<listitem>
<para>
<methodname>setErrorHandlerModule()</methodname> définit le module à utiliser.
</para>
</listitem>
<listitem>
<para>
<methodname>setErrorHandlerController()</methodname> définit le contrôleur à
utiliser.
</para>
</listitem>
<listitem>
<para>
<methodname>setErrorHandlerAction()</methodname> définit l'action à utiliser.
</para>
</listitem>
<listitem>
<para>
<methodname>setErrorHandler()</methodname> est un raccourci des trois précédantes.
Passez un tableau avec les clés "module", "controller", or "action", et leurs
valeurs appropriées.
</para>
</listitem>
</itemizedlist>
<para>
Ce comportement fonctionne aussi avec le constructeur du plugin. Celui-ci agit comme
un proxy vers <methodname>setErrorHandler()</methodname>.
</para>
<para>
<classname>Zend_Controller_Plugin_ErrorHandler</classname> agit en
<methodname>postDispatch()</methodname> et analyse
<link linkend="zend.controller.response">l'objet de réponse</link>à la recherche
d'éventuelles exceptions. Si il y en a, alors le plugin modifie la requête pour distribuer
le contrôleur et l'action d'erreur.
</para>
<para>
Si une exception arrive lorsque le plugin agit, alors celui-ci ordonne au contrôleur
frontal de renvoyer l'exception, et relance la dernière exception enregistrée dans l'objet
de réponse.
</para>
<sect4 id="zend.controller.plugins.standard.errorhandler.fourohfour">
<title>Utilisation de ErrorHandler pour gérer les erreurs 404</title>
<para>
Comme <emphasis>ErrorHandler</emphasis> capture les exceptions relatives à un problème
de contrôleur ou action manquants, vous pouvez donc l'utiliser comme un gestionnaire
d'erreurs 404. Pour cela, il faut analyser le type d'exception ayant mené à l'erreur.
</para>
<para>
Les exceptions capturées sont enregistrées en tant que paramètre d'action.
<methodname>Zend_Controller_Action::_getParam('error_handler')</methodname>:
</para>
<programlisting language="php"><![CDATA[
class ErrorController extends Zend_Controller_Action
{
public function errorAction()
{
$errors = $this->_getParam('error_handler');
}
}
]]></programlisting>
<para>
Une fois que vous possédez l'objet contenant l'exception, inspectez son type avec
<command>$errors->type;</command>. Des constantes sont à votre disposition :
</para>
<itemizedlist>
<listitem>
<para>
<constant>Zend_Controller_Plugin_ErrorHandler::EXCEPTION_NO_ROUTE</constant>,
indique qu'aucune route correspondante n'a été trouvée.
</para>
</listitem>
<listitem>
<para>
<constant>Zend_Controller_Plugin_ErrorHandler::EXCEPTION_NO_CONTROLLER</constant>,
indique un contrôleur non trouvé.
</para>
</listitem>
<listitem>
<para>
<constant>Zend_Controller_Plugin_ErrorHandler::EXCEPTION_NO_ACTION</constant>,
indique qu'une action est absente.
</para>
</listitem>
<listitem>
<para>
<constant>Zend_Controller_Plugin_ErrorHandler::EXCEPTION_OTHER</constant>,
indique une autre exception.
</para>
</listitem>
</itemizedlist>
<para>Les trois premiers types pourraient mener à une erreur 404 :</para>
<programlisting language="php"><![CDATA[
class ErrorController extends Zend_Controller_Action
{
public function errorAction()
{
$errors = $this->_getParam('error_handler');
switch ($errors->type) {
case Zend_Controller_Plugin_ErrorHandler::EXCEPTION_NO_ROUTE:
case Zend_Controller_Plugin_ErrorHandler::EXCEPTION_NO_CONTROLLER:
case Zend_Controller_Plugin_ErrorHandler::EXCEPTION_NO_ACTION:
// erreur 404 -- contrôleur ou action introuvable
$this->getResponse()->setRawHeader('HTTP/1.1 404 Not Found');
// ... ici, de l'affichage (du rendu)
break;
default:
// erreur applicative; affiche une page d'erreur,
// mais sans changer le code de retour HTTP
break;
}
}
}
]]></programlisting>
<para>
Enfin, il est possible de récupérer l'exception ayant menée au contrôleur
d'erreur. Ceci afin de l'analyser. L'attribut <property>exception</property> de
l'objet <emphasis>error_handler</emphasis> le permet :
</para>
<programlisting language="php"><![CDATA[
public function errorAction()
{
$errors = $this->_getParam('error_handler');
switch ($errors->type) {
case Zend_Controller_Plugin_ErrorHandler::EXCEPTION_NO_ROUTE:
case Zend_Controller_Plugin_ErrorHandler::EXCEPTION_NO_CONTROLLER:
case Zend_Controller_Plugin_ErrorHandler::EXCEPTION_NO_ACTION:
// erreur 404 -- contrôleur ou action introuvable
$this->getResponse()->setRawHeader('HTTP/1.1 404 Not Found');
// ... ici, de l'affichage (du rendu)
break;
default:
// erreur applicative; affiche une page d'erreur,
// mais sans changer le code de retour HTTP
// ...
// Sauve l'exception en log:
$exception = $errors->exception;
$log =
new Zend_Log(
new Zend_Log_Writer_Stream(
'/tmp/applicationException.log')
);
$log->debug($exception->getMessage()
. "\n"
. $exception->getTraceAsString());
break;
}
}
]]></programlisting>
</sect4>
<sect4 id="zend.controller.plugins.standard.errorhandler.buffer">
<title>Gestion des rendus précédants de la réponse</title>
<para>
Si vous décomposez vos processus en plusieurs actions ou plusieurs appels à
<methodname>render()</methodname>, il est possible que la réponse contienne déjà des
éléments. Ceci peut introduire un mélange entre le rendu attendu et le contenu de
l'erreur.
</para>
<para>
Si vous désirez rendre votre contrôleur d'erreur dans ce contenu, alors il n'y a
rien à faire de spécial. En revanche, il peut aussi être judicieux de vider totalement
la réponse afin de rendre le contrôleur d'erreurs. Procédez alors comme suit :
</para>
<programlisting language="php"><![CDATA[
$this->getResponse()->clearBody();
]]></programlisting>
</sect4>
<sect4 id="zend.controller.plugins.standard.errorhandler.examples">
<title>Exemples d'utilisation</title>
<example id="zend.controller.plugins.standard.errorhandler.examples.example-1">
<title>Utilisation standard et désactivation</title>
<programlisting language="php"><![CDATA[
$front = Zend_Controller_Front::getInstance();
$front->registerPlugin(new Zend_Controller_Plugin_ErrorHandler());
]]></programlisting>
</example>
<example id="zend.controller.plugins.standard.errorhandler.examples.example-2">
<title>Paramétrage du plugin</title>
<programlisting language="php"><![CDATA[
$front = Zend_Controller_Front::getInstance();
$front->registerPlugin(new Zend_Controller_Plugin_ErrorHandler(array(
'module' => 'mystuff',
'controller' => 'static',
'action' => 'error'
)));
]]></programlisting>
</example>
<example id="zend.controller.plugins.standard.errorhandler.examples.example-3">
<title>Utilisation des accesseurs</title>
<programlisting language="php"><![CDATA[
$plugin = new Zend_Controller_Plugin_ErrorHandler();
$plugin->setErrorHandlerModule('mystuff')
->setErrorHandlerController('static')
->setErrorHandlerAction('error');
$front = Zend_Controller_Front::getInstance();
$front->registerPlugin($plugin);
]]></programlisting>
</example>
</sect4>
<sect4 id="zend.controller.plugins.standard.errorhandler.controllerexamples">
<title>Exemple de contrôleur d'erreurs</title>
<para>
Pour utiliser le plugin de gestion d'erreurs, un contrôleur d'erreurs est
requis. En voici un exemple :
</para>
<programlisting language="php"><![CDATA[
class ErrorController extends Zend_Controller_Action
{
public function errorAction()
{
$errors = $this->_getParam('error_handler');
switch ($errors->type) {
case Zend_Controller_Plugin_ErrorHandler::EXCEPTION_NO_ROUTE:
case Zend_Controller_Plugin_ErrorHandler::EXCEPTION_NO_CONTROLLER:
case Zend_Controller_Plugin_ErrorHandler::EXCEPTION_NO_ACTION:
// 404 error -- controller or action not found
$this->getResponse()->setRawHeader('HTTP/1.1 404 Not Found');
$content =<<<EOH
<h1>Erreur !</h1>
<p>Page introuvable.</p>
EOH;
break;
default:
// application error
$content =<<<EOH
<h1>Erreur !</h1>
<p>Une erreur innatendue est survenue</p>
EOH;
break;
}
// Vide le contenu de la réponse
$this->getResponse()->clearBody();
$this->view->content = $content;
}
}
]]></programlisting>
</sect4>
</sect3>
|