Consultez la FAQ sur le ZF avant de poster une question
Vous n'êtes pas identifié.
Pages: 1
Bonjour,
Décidément j'ai beaucoup de questions en ce moment.
Celle-ci concerne mon controller d'erreur.
Il n'intercepte pas les erreurs de controlleur inéxistant, mais par contre il choppe bien les erreurs d'action inéxistante.
Dans mon bootstrap:
try { $frontController->dispatch(); // dispatche ! } catch (Exception $exception) { // attrape toute exception exit($exception->getMessage()); }
Evidemment j'ai viré la fameuse ligne :
$frontController->throwExceptions(true);
Sachant que j'ai aussi un plugin en preDispatch:
class MyLib_Plugin_Rout extends Zend_Controller_Plugin_Abstract { public function __construct() { } public function preDispatch(Zend_Controller_Request_Abstract $request) { $controller = $request->controller; $action = $request->action; $module = $request->module; $pos = strrpos($controller, '.html'); if ($pos === false) { $pos = strrpos($action, '.html'); if (!($pos === false)) { $action = substr($action, 0, $pos); } } else { $action = substr($controller, 0, $pos); $controller = 'index'; } $request->setModuleName($module); $request->setControllerName($controller); $request->setActionName($action); // die('module : ' . $module . ' / controller : ' . $controller . ' / action : ' . $action); } }
Mon ErrorController :
class ErrorController extends Zend_Controller_Action { private $_exception; private static $errorMessage; private static $httpCode; public function preDispatch() { $this->_exception = $this->_getParam('error_handler'); $this->_response->clearBody(); // on vide le contenu de la réponse $this->_response->append('error',null); // on ajoute un segment 'error' dans la réponse switch ($this->_exception->type) { case Zend_Controller_Plugin_ErrorHandler::EXCEPTION_NO_CONTROLLER: case Zend_Controller_Plugin_ErrorHandler::EXCEPTION_NO_ACTION: self::$httpCode = 404; self::$errorMessage = 'Page introuvable'; break; case Zend_Controller_Plugin_ErrorHandler::EXCEPTION_OTHER: switch (get_class($this->_exception->exception)) { case 'Zend_View_Exception' : self::$httpCode = 500; self::$errorMessage = 'Erreur de traitement d\'une vue'; break; case 'Zend_Db_Exception' : self::$httpCode = 503; self::$errorMessage = 'Erreur de traitement dans la base de données'; break; case 'Metier_Exception' : self::$httpCode = 200; self::$errorMessage = $this->_exception->exception->getMessage(); break; case 'Autre_Exception' : self::$httpCode = 500; self::$errorMessage = 'Exemple avec une "autre exception"'; break; default: self::$httpCode = 500; self::$errorMessage = 'Erreur inconnue'; break; } break; } } public function errorAction() { $this->_helper->layout->setLayout('layout-in'); $this->getResponse()->setHttpResponseCode(self::$httpCode); $this->_errorMessage .= sprintf("<p>%s</p>",self::$errorMessage); $this->view->errorMessage = $this->_errorMessage; } public function postDispatch() { } }
- Si j'entre l'url 'http://www.toto.com/index/addsq', l'exception est bien interceptée par le controller.
- Par contre, si j'entre 'http://www.toto.com/addsq', je suis redirigé sur l'index.
Un jolie die dans mon plugin (à la fin du traitement biensur) :
die('module : ' . $module . ' / controller : ' . $controller . ' / action : ' . $action);
Me donne bien dans le premier cas :
module : default / controller : index / action : addsq
---> exception levée et interceptée par le controller
Et dans le 2eme :
module : default / controller : addsq / action : index
---> pas d'exception, redirigé vers l'index
Et autre question :
Dans mes actions quand je fais :
throw new Exception(Zend_Controller_Plugin_ErrorHandler::EXCEPTION_NO_ACTION);
Il me lève l'exception, mais elle n'est pas interceptée par le ErrorController. Comment faire ?
Des idées ?
Merci beaucoup,
A+ benjamin.
Dernière modification par Delprog (09-10-2008 09:49:56)
Hors ligne
Bon j'ai trouvé, c'était une grosse ânerie de ma part.
J'avais dans le bootstrap:
$frontController->setParam('useDefaultControllerAlways', true);
Et pour être un gland jusqu'au bout, mon plugin interceptait le preDispatch et les exceptions ne pouvaient pas être interceptées correctement par le ErrorController, qui lui même, est géré en preDispatch.
J'ai donc passé mon plugin en routeShutDown.
C'est dans la veine du :
$frontController->throwExceptions(true);
Saleté !
Voilà un exemple parfait de "comment perdre son temps comme un con".
A+ benjamin.
Hors ligne
Pages: 1