1 <?xml version="1.0" encoding="utf-8"?>
2 <!-- EN-Revision: 20765 -->
4 <sect3 id="zend.controller.plugins.standard.errorhandler">
5 <title>Zend_Controller_Plugin_ErrorHandler</title>
8 <classname>Zend_Controller_Plugin_ErrorHandler</classname> est un plugin intégré par défaut
9 pour gérer les exceptions levées par votre application, il sert à gérer les exceptions
10 envoyées par l'application, en particulier celles concernant des contrôleurs ou des actions
11 manquants. C'est une manière rejoignant la section
12 <link linkend="zend.controller.exceptions">Exceptions MVC</link>.
15 <para>Les principaux objectifs de ce plugin sont :</para>
19 <para>Intercepter les exceptions envoyées si aucune route ne correspond</para>
23 Intercepter les exceptions envoyées si un contrôleur ou une action ne peuvent
28 <para>Intercepte les exceptions envoyées dans les contrôleurs</para>
33 Globalement, <emphasis>ErrorHandler</emphasis> sert à gérer les erreurs
34 <acronym>HTTP</acronym> 404 ou 500. Attention, le plugin n'est pas destiné à intervenir sur
35 les exceptions envoyées dans d'autres plugins. Des effets de bords peuvent apparaître,
40 Par défaut, <classname>Zend_Controller_Plugin_ErrorHandler</classname> redirige vers
41 <methodname>ErrorController::errorAction()</methodname> dans le module par défaut. Vous
42 pouvez passer d'autres valeurs via les accesseurs du plugin :
48 <methodname>setErrorHandlerModule()</methodname> définit le module à utiliser.
53 <methodname>setErrorHandlerController()</methodname> définit le contrôleur à
59 <methodname>setErrorHandlerAction()</methodname> définit l'action à utiliser.
64 <methodname>setErrorHandler()</methodname> est un raccourci des trois précédantes.
65 Passez un tableau avec les clés "module", "controller", or "action", et leurs
72 Ce comportement fonctionne aussi avec le constructeur du plugin. Celui-ci agit comme
73 un proxy vers <methodname>setErrorHandler()</methodname>.
77 <classname>Zend_Controller_Plugin_ErrorHandler</classname> agit en
78 <methodname>postDispatch()</methodname> et analyse
79 <link linkend="zend.controller.response">l'objet de réponse</link>à la recherche
80 d'éventuelles exceptions. Si il y en a, alors le plugin modifie la requête pour distribuer
81 le contrôleur et l'action d'erreur.
85 Si une exception arrive lorsque le plugin agit, alors celui-ci ordonne au contrôleur
86 frontal de renvoyer l'exception, et relance la dernière exception enregistrée dans l'objet
90 <sect4 id="zend.controller.plugins.standard.errorhandler.fourohfour">
91 <title>Utilisation de ErrorHandler pour gérer les erreurs 404</title>
94 Comme <emphasis>ErrorHandler</emphasis> capture les exceptions relatives à un problème
95 de contrôleur ou action manquants, vous pouvez donc l'utiliser comme un gestionnaire
96 d'erreurs 404. Pour cela, il faut analyser le type d'exception ayant mené à l'erreur.
100 Les exceptions capturées sont enregistrées en tant que paramètre d'action.
101 <methodname>Zend_Controller_Action::_getParam('error_handler')</methodname>:
104 <programlisting language="php"><![CDATA[
105 class ErrorController extends Zend_Controller_Action
107 public function errorAction()
109 $errors = $this->_getParam('error_handler');
115 Une fois que vous possédez l'objet contenant l'exception, inspectez son type avec
116 <command>$errors->type;</command>. Des constantes sont à votre disposition :
122 <constant>Zend_Controller_Plugin_ErrorHandler::EXCEPTION_NO_ROUTE</constant>,
123 indique qu'aucune route correspondante n'a été trouvée.
128 <constant>Zend_Controller_Plugin_ErrorHandler::EXCEPTION_NO_CONTROLLER</constant>,
129 indique un contrôleur non trouvé.
134 <constant>Zend_Controller_Plugin_ErrorHandler::EXCEPTION_NO_ACTION</constant>,
135 indique qu'une action est absente.
140 <constant>Zend_Controller_Plugin_ErrorHandler::EXCEPTION_OTHER</constant>,
141 indique une autre exception.
146 <para>Les trois premiers types pourraient mener à une erreur 404 :</para>
148 <programlisting language="php"><![CDATA[
149 class ErrorController extends Zend_Controller_Action
151 public function errorAction()
153 $errors = $this->_getParam('error_handler');
155 switch ($errors->type) {
156 case Zend_Controller_Plugin_ErrorHandler::EXCEPTION_NO_ROUTE:
157 case Zend_Controller_Plugin_ErrorHandler::EXCEPTION_NO_CONTROLLER:
158 case Zend_Controller_Plugin_ErrorHandler::EXCEPTION_NO_ACTION:
159 // erreur 404 -- contrôleur ou action introuvable
160 $this->getResponse()->setRawHeader('HTTP/1.1 404 Not Found');
162 // ... ici, de l'affichage (du rendu)
165 // erreur applicative; affiche une page d'erreur,
166 // mais sans changer le code de retour HTTP
174 Enfin, il est possible de récupérer l'exception ayant menée au contrôleur
175 d'erreur. Ceci afin de l'analyser. L'attribut <property>exception</property> de
176 l'objet <emphasis>error_handler</emphasis> le permet :
179 <programlisting language="php"><![CDATA[
180 public function errorAction()
182 $errors = $this->_getParam('error_handler');
184 switch ($errors->type) {
185 case Zend_Controller_Plugin_ErrorHandler::EXCEPTION_NO_ROUTE:
186 case Zend_Controller_Plugin_ErrorHandler::EXCEPTION_NO_CONTROLLER:
187 case Zend_Controller_Plugin_ErrorHandler::EXCEPTION_NO_ACTION:
188 // erreur 404 -- contrôleur ou action introuvable
189 $this->getResponse()->setRawHeader('HTTP/1.1 404 Not Found');
191 // ... ici, de l'affichage (du rendu)
194 // erreur applicative; affiche une page d'erreur,
195 // mais sans changer le code de retour HTTP
199 // Sauve l'exception en log:
200 $exception = $errors->exception;
203 new Zend_Log_Writer_Stream(
204 '/tmp/applicationException.log')
206 $log->debug($exception->getMessage()
208 . $exception->getTraceAsString());
215 <sect4 id="zend.controller.plugins.standard.errorhandler.buffer">
216 <title>Gestion des rendus précédants de la réponse</title>
219 Si vous décomposez vos processus en plusieurs actions ou plusieurs appels à
220 <methodname>render()</methodname>, il est possible que la réponse contienne déjà des
221 éléments. Ceci peut introduire un mélange entre le rendu attendu et le contenu de
226 Si vous désirez rendre votre contrôleur d'erreur dans ce contenu, alors il n'y a
227 rien à faire de spécial. En revanche, il peut aussi être judicieux de vider totalement
228 la réponse afin de rendre le contrôleur d'erreurs. Procédez alors comme suit :
231 <programlisting language="php"><![CDATA[
232 $this->getResponse()->clearBody();
236 <sect4 id="zend.controller.plugins.standard.errorhandler.examples">
237 <title>Exemples d'utilisation</title>
239 <example id="zend.controller.plugins.standard.errorhandler.examples.example-1">
240 <title>Utilisation standard et désactivation</title>
242 <programlisting language="php"><![CDATA[
243 $front = Zend_Controller_Front::getInstance();
244 $front->registerPlugin(new Zend_Controller_Plugin_ErrorHandler());
248 <example id="zend.controller.plugins.standard.errorhandler.examples.example-2">
249 <title>Paramétrage du plugin</title>
251 <programlisting language="php"><![CDATA[
252 $front = Zend_Controller_Front::getInstance();
253 $front->registerPlugin(new Zend_Controller_Plugin_ErrorHandler(array(
254 'module' => 'mystuff',
255 'controller' => 'static',
261 <example id="zend.controller.plugins.standard.errorhandler.examples.example-3">
262 <title>Utilisation des accesseurs</title>
264 <programlisting language="php"><![CDATA[
265 $plugin = new Zend_Controller_Plugin_ErrorHandler();
266 $plugin->setErrorHandlerModule('mystuff')
267 ->setErrorHandlerController('static')
268 ->setErrorHandlerAction('error');
270 $front = Zend_Controller_Front::getInstance();
271 $front->registerPlugin($plugin);
276 <sect4 id="zend.controller.plugins.standard.errorhandler.controllerexamples">
277 <title>Exemple de contrôleur d'erreurs</title>
280 Pour utiliser le plugin de gestion d'erreurs, un contrôleur d'erreurs est
281 requis. En voici un exemple :
284 <programlisting language="php"><![CDATA[
285 class ErrorController extends Zend_Controller_Action
287 public function errorAction()
289 $errors = $this->_getParam('error_handler');
291 switch ($errors->type) {
292 case Zend_Controller_Plugin_ErrorHandler::EXCEPTION_NO_ROUTE:
293 case Zend_Controller_Plugin_ErrorHandler::EXCEPTION_NO_CONTROLLER:
294 case Zend_Controller_Plugin_ErrorHandler::EXCEPTION_NO_ACTION:
295 // 404 error -- controller or action not found
296 $this->getResponse()->setRawHeader('HTTP/1.1 404 Not Found');
300 <p>Page introuvable.</p>
307 <p>Une erreur innatendue est survenue</p>
312 // Vide le contenu de la réponse
313 $this->getResponse()->clearBody();
315 $this->view->content = $content;