Consultez la FAQ sur le ZF avant de poster une question
Vous n'êtes pas identifié.
Pages: 1
Bonjour,
ma demande concerne les pages 404.
J'ai un controller d'erreur qui gère les pages qui ne sont pas dans la route.
En revanche je souhaite lancer des 404 dans un controlleur si il ne trouve pas tel ou tel élément.
Donc dans un controlleur lorsque je souhaite appeler le script je fais:
$this->_forward("throw404","Error");
Or ce script continue à exécuter le controlleur en cours.
Je pourrais bien sur rajouter à la suite de ça l'élément return; mais je ne trouve pas ça très propre.
Donc je vous pose la question, est ce que la fonction forward est la bonne fonction à utiliser ou dois je utiliser une autre qui arrêtera le script en cours.
Pour info j'ai mis en place le module d'erreur de julien:
http://julien-pauli.developpez.com/tuto … ceptions2/
et voici l'action perso throw404:
public function throw404Action(){ self::$errorMessage = 'Page introuvable'; self::$httpCode = 404; $this->displayAction(); }
Hors ligne
pourquoi ??
Perso, mon choix entre _redirect et _forward est fait en fonction de la page appelé. J'utilise redirect dans le cas de formulaire posté (pour éviter le repostage lors d'un actualiser).
Dans le cas d'une page non trouvé, pour moi, c'est pareil
soit _forward + exit, soit _redirect.
Dans mon application, j'utilise des modules par défaut, donc, c'est 'une sorte' de _forward qui est appliqué vers le module par défaut lorsque celui demandé n'existe pas (fonctionnement interne du ZF)
Hors ligne
en gros si j ai bien compris la différence;
Redirect ne finit pas la suite du script alors que forward oui
Hors ligne
pas tout à fait
redirect envois un 403 au client qui veint alors charger l'action suivante
alors que forward exécute dans l'action courant le code de l'action suivante
pour stopper le script courant il faut faire
$this->_helper->redirector->gotoUrlAndExit($url, $options);
j'utilise plutot les exception dans ce cas là
si mon script plante ou n'a pas la resource necessaire et que je veux que ça finisse en 404 je lève une exception par exemple UNDEFINED_ACTION
du coup mon script plante et m'affiche une belle exception Zend.
et ce comme pour tout autre problème dans mon application.
lorsque j'ai fini j'active Zend_Controller_Plugin_ErrorHandler et je (j'ai déjà) défini un controlleur d'exception
<?php require dirname(__FILE__).'/Action.php'; /** * Contrôleur d'erreur de l'application * @author Jean-Yves Terrien * @package Fast_Module * @subpackage Exception_Module * @copyright Copyright (c) 2007-2008 Orange FT Group. (http://www.francetelecom.com) * @license A définir http://framework.zend.com/license/new-bsd New BSD License */ class Exception_ErrorController extends Exception_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 $msgs = $this->getParams('messages'); if (isset($this->_exception->type)) { 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 = 'Resource indisponible'; break; case Zend_Controller_Plugin_ErrorHandler::EXCEPTION_OTHER: if ($msgs) { $ok = false; foreach ($msgs as $class=>$error) { if (!$ok&&($this->_exception->exception instanceOf $class)) { foreach ($error as $exception=>$values) { if (!$ok&&('code' != $exception)&&('message' != $exception)&&($this->_exception->exception->getConst() == $exception)) { self::$httpCode = (int)$values['code']; self::$errorMessage = $values['message']; $ok = true; } } if (!$ok) { #Fast_Debug::show('$error', $error); self::$httpCode = (int)$error['code']; self::$errorMessage = $error['message']; $ok = true; } } } if (!$ok) { self::$httpCode = 500; self::$errorMessage = 'Erreur inconnue'; } } else { switch (get_class($this->_exception->exception)) { case 'Fast_View_Exception' : case 'Zend_View_Exception' : self::$httpCode = 500; self::$errorMessage = 'Erreur de traitement d\'une vue'; break; case 'Zend_Db_Exception' : case 'Fast_Db_Exception' : self::$httpCode = 503; self::$errorMessage = 'Erreur de traitement dans la base de données'; break; case 'Fast_Controller_Exception' : switch ($this->_exception->exception->getConst()) { case 'UNDEFINED_ACTION': case 'UNDEFINED_METHOD_NAME': case 'UNDEFINED_MEMBER': case 'INVALID_CONTROLLER': case 'INVALID_CONTROLLER_CLASS': self::$httpCode = 404; self::$errorMessage = 'Resource indisponible'; break; default: self::$httpCode = 503; self::$errorMessage = 'Erreur interne'; break; } break; default: self::$httpCode = 500; self::$errorMessage = 'Erreur inconnue'; break; } } break; } }else{ self::$httpCode = 200; self::$errorMessage = $this->_exception; } } public function displayAction() { $this->getResponse()->setHttpResponseCode(self::$httpCode); $this->_messenger->addError(self::$httpCode.' : '.self::$errorMessage); $this->view->title = 'Error : '.self::$httpCode; $exception = $this->_exception->exception; if (class_exists('Fast_Debug')&&Fast_Debug::displayDebug()) { $msg = ereg_replace(' in ', "\nin ", $exception->__toString()); if(isset($exception->includeErrors)) { $msg.="\n"; foreach ($exception->includeErrors as $key=>$value) { $msg.="\n".$value->errstr; } } ob_start(); Fast_Debug::show($exception->getMessage(),$msg); $message = ob_get_clean(); $this->view->error = $message; } } }
ce dernier charge un fichier de conf qui lui dit comment ce comporter en fonction des exception levées et du niveau d'affichage souhaité.
[ messages ] Fast_Controller_Exception.UNDEFINED_ACTION.code = 404 Fast_Controller_Exception.UNDEFINED_ACTION.message = Resource indisponible Fast_Controller_Exception.UNDEFINED_METHOD_NAME.code = 404 Fast_Controller_Exception.UNDEFINED_METHOD_NAME.message = Resource indisponible Fast_Controller_Exception.UNDEFINED_MEMBER.code = 404 Fast_Controller_Exception.UNDEFINED_MEMBER.message = Resource indisponible Fast_Controller_Exception.INVALID_CONTROLLER.code = 404 Fast_Controller_Exception.INVALID_CONTROLLER.message = Resource indisponible Fast_Controller_Exception.INVALID_CONTROLLER_CLASS.code = 404 Fast_Controller_Exception.INVALID_CONTROLLER_CLASS.message = Resource indisponible Fast_Controller_Exception.code = 503 Fast_Controller_Exception.message = Erreur interne Fast_View_Exception.code = 503 Fast_View_Exception.message = Erreur de traitement dans la présentation des données Zend_View_Exception.code = 503 Zend_View_Exception.message = Erreur de traitement dans la présentation des données Zend_Db_Exception.code = 503 Zend_Db_Exception.message = Erreur de traitement dans la base de données Fast_Db_Exception.code = 503 Fast_Db_Exception.message = Erreur de traitement dans la base de données
ainsi en production un exception UNDEFINED_ACTION génèrera un 404 "resource not found"
si le mode débug est actif j'aurais en plus le détail de l'exception.
alors qu'en dev je ne travaille que sur la problématique de mon application.
A+JYT
Hors ligne
peux tu me donner un exemple d'utilisation de gotoUrlAndExit, que met tu dans URL (URL du plugin error c est bien ça ?) qu elles sont les options possibles ?
Pourquoi avoir une classe FastDebug ?
merci
Hors ligne
le goto url and exit fonctionne comme le redirect
Hors ligne
oui mais le problème c est qu'on ne souhaite pas faire une redirection mais afficher une 404 avec son code d'erreur.
donc pourquoi un redirect ? je n'ai peux etre pas compris la subtilité
Hors ligne
tu as ça dans mon exemple en début de la méthode displayAction
$this->getResponse()->setHttpResponseCode(self::$httpCode);
Je conseille tout de même de lire la doc sur les Zend_Controller_Plugin_ErrorHandler
car c'est beaucoup plus simple ensuite de gérer tous type d'erreur
le 404 n'étant qu'un cas parmi tant d'autres
A+JYT
Dernière modification par sekaijin (08-07-2008 12:54:27)
Hors ligne
ok je vais essayer de voir ça plus en détail. En tout cas merci
Hors ligne
Pages: 1