@takeshin: Merci de partager votre plugin, cette c'est génial! Et juste la chose que je cherchais sur la machine Google. J'ai apporté quelques modifications, respectueusement, à la logique qui détermine la demande d'être une "demande d'erreur", puisque j'ai trouvé que le rappel du plugin complet était en cours d'exécution à chaque requête, qu'une erreur soit survenue ou non.
Je viens de changer le hook du plugin en "postDispatch" et j'ai testé qu'une exception s'était réellement produite pendant l'expédition. Le reste du code fonctionne exactement comme le vôtre.
Maintenant, vous pouvez placer une instruction die au milieu du plugin, et vous ne la verrez qu'après une exception lors de la requête.
<?php
class Rm_Controller_Plugin_Modular_ErrorController
extends Zend_Controller_Plugin_Abstract
{
public function postDispatch(Zend_Controller_Request_Abstract $request)
{
$front = Zend_Controller_Front::getInstance();
// true if response has any exception
$isError = $front->getResponse()->hasExceptionOfType('Exception');
// if there was no error during dispatch
if (!$isError) {
return false;
}
// standard error handler plugin class name
$errorHandlerClass = 'Zend_Controller_Plugin_ErrorHandler';
// if the error handler plugin is not registered, do not continue.
if (!$front->hasPlugin($errorHandlerClass)) {
return false;
}
$plugin = $front->getPlugin($errorHandlerClass);
// the module that was requested and threw error
$module = $request->getModuleName();
// the controller & action name that error handler will dispatch
$errorController = $plugin->getErrorHandlerController();
$errorAction = $plugin->getErrorHandlerAction();
// create a dummy request to test for dispatchablility
$testRequest = new Zend_Controller_Request_Http();
$testRequest->setModuleName($module)
->setControllerName($errorController)
->setActionName($errorAction);
// verify that the current module has defined an ErrorController::errorAction
if ($front->getDispatcher()->isDispatchable($testRequest)) {
// tell error controller plugin to use the module's error controller
$plugin->setErrorHandlerModule($module);
} else {
return false;
}
return true;
}
}
Génial, merci! –