Zend FR

Consultez la FAQ sur le ZF avant de poster une question

Vous n'êtes pas identifié.

#1 08-10-2008 11:42:32

Delprog
Administrateur
Date d'inscription: 29-09-2008
Messages: 670

[Résolu] Exception controller inexistant non interceptée / Controller

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:

Code:

try {
    $frontController->dispatch(); // dispatche !
} 
catch (Exception $exception) { // attrape toute exception
    exit($exception->getMessage());
}

Evidemment j'ai viré la fameuse ligne :

Code:

$frontController->throwExceptions(true);

Sachant que j'ai aussi un plugin en preDispatch:

Code:

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 :

Code:

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

Code:

die('module : ' . $module . ' / controller : ' . $controller . ' / action : ' . $action);

Me donne bien dans le premier cas :

Code:

module : default / controller : index / action : addsq

---> exception levée et interceptée par le controller

Et dans le 2eme :

Code:

module : default / controller : addsq / action : index

---> pas d'exception, redirigé vers l'index


Et autre question :

Dans mes actions quand je fais :

Code:

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 ? smile

Merci beaucoup,

A+ benjamin.

Dernière modification par Delprog (09-10-2008 09:49:56)


http://www.anonymation.com/ - anonymation - Studio de création.
http://code.anonymation.com/ - anonymation - blog - développement et architecture web

Hors ligne

 

#2 08-10-2008 16:55:05

Delprog
Administrateur
Date d'inscription: 29-09-2008
Messages: 670

Re: [Résolu] Exception controller inexistant non interceptée / Controller

Bon j'ai trouvé, c'était une grosse ânerie de ma part.

J'avais dans le bootstrap:

Code:

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

Code:

$frontController->throwExceptions(true);

Saleté !

Voilà un exemple parfait de "comment perdre son temps comme un con".


A+ benjamin.


http://www.anonymation.com/ - anonymation - Studio de création.
http://code.anonymation.com/ - anonymation - blog - développement et architecture web

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