Zend FR

Consultez la FAQ sur le ZF avant de poster une question

Vous n'êtes pas identifié.

#1 07-07-2008 13:31:20

bucheron
Membre
Date d'inscription: 30-05-2008
Messages: 138

Affichage d'une page 404 depuis un controlleur

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:

Code:

 $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:

Code:

    public function throw404Action(){
         self::$errorMessage = 'Page introuvable';
         self::$httpCode = 404;
         $this->displayAction();
    }

Hors ligne

 

#2 07-07-2008 16:17:11

Akis
Membre
Date d'inscription: 29-03-2008
Messages: 86
Site web

Re: Affichage d'une page 404 depuis un controlleur

J'utiliserais plutôt _redirect que _forward wink

Hors ligne

 

#3 07-07-2008 16:37:04

nORKy
Membre
Date d'inscription: 06-03-2008
Messages: 1098

Re: Affichage d'une page 404 depuis un controlleur

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)


----
Gruiiik !

Hors ligne

 

#4 07-07-2008 17:26:55

bucheron
Membre
Date d'inscription: 30-05-2008
Messages: 138

Re: Affichage d'une page 404 depuis un controlleur

en gros si j ai bien compris la différence;
Redirect ne finit pas la suite du script alors que forward oui

Hors ligne

 

#5 07-07-2008 17:47:53

sekaijin
Membre
Date d'inscription: 17-08-2007
Messages: 1137

Re: Affichage d'une page 404 depuis un controlleur

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

Code:

$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

Code:

<?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é.

Code:

[ 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

 

#6 07-07-2008 18:18:59

bucheron
Membre
Date d'inscription: 30-05-2008
Messages: 138

Re: Affichage d'une page 404 depuis un controlleur

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

 

#7 07-07-2008 22:15:11

sekaijin
Membre
Date d'inscription: 17-08-2007
Messages: 1137

Re: Affichage d'une page 404 depuis un controlleur

le goto url and exit fonctionne comme le redirect

Hors ligne

 

#8 08-07-2008 01:11:07

bucheron
Membre
Date d'inscription: 30-05-2008
Messages: 138

Re: Affichage d'une page 404 depuis un controlleur

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

 

#9 08-07-2008 12:52:52

sekaijin
Membre
Date d'inscription: 17-08-2007
Messages: 1137

Re: Affichage d'une page 404 depuis un controlleur

tu as ça dans mon exemple en début de la méthode displayAction

Code:

$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

 

#10 08-07-2008 15:52:09

bucheron
Membre
Date d'inscription: 30-05-2008
Messages: 138

Re: Affichage d'une page 404 depuis un controlleur

ok je vais essayer de voir ça plus en détail. En tout cas merci

Hors ligne

 

Pied de page des forums

Propulsé par PunBB
© Copyright 2002–2005 Rickard Andersson
Traduction par punbb.fr

Graphisme réalisé par l'agence Rodolphe Eveilleau
Développement par Kitpages