Zend FR

Consultez la FAQ sur le ZF avant de poster une question

Vous n'êtes pas identifié.

#1 12-02-2009 10:20:44

creatix
Membre
Date d'inscription: 03-08-2008
Messages: 17

[résolu]Gestion des exceptions...

Bonjour,
Mon application marche pas trop mal, mais j'aimerai géré les exceptions. J'utilise une classe pour mes ACL qui utilise aussi les exceptions il me semble.
j'utilise le controlleur error avec la méthode error donc il semblerai que j'utilise Zend_Controller_Plugin_ErrorHandler par defaut (je n'ai pas changer les fichiers par défaut ou presque pas)
Voici les codes sources:

/application/controllers/ErrorController.php

Code:

class ErrorController extends Zend_Controller_Action
{
    public function errorAction()
    {
        $errors = $this->_getParam('error_handler');

        switch ($errors->type) {
            case Zend_Controller_Plugin_ErrorHandler::EXCEPTION_NO_CONTROLLER:
            case Zend_Controller_Plugin_ErrorHandler::EXCEPTION_NO_ACTION:
                // erreur 404 -- contrôleur ou action non trouvé
                $this->getResponse()->setRawHeader('HTTP/1.1 404 Not Found');

                $content =<<<EOH
<h1>Erreur!</h1>
<p>Page introuvable.</p>
EOH;
                break;
            default:
                // erreur d'application
                $content =<<<EOH
<h1>Erreur!</h1>
<p>Une erreur innatendue est survenue</p>
EOH;
                break;
        }

        // Vide la réponse
        $this->getResponse()->clearBody();

        $this->view->content = $content;
    }
}

j'ai un phtml avec (j'utilise Zend_layout donc logiquement le code d'erreur va dans ma page layout.phtml)

Code:

  <h1>An error occurred</h1> 
  <h2><?= $this->message ?></h2> 

  <?// if ('development' == $this->env): ?> 
  
  <h3>Exception information:</h3> 
  <p> 
      <b>Message:</b> <?= $this->exception->getMessage() ?> 
  </p> 

  <h3>Stack trace:</h3> 
  <pre><?= $this->exception->getTraceAsString() ?> 
  </pre> 

  <h3>Request Parameters:</h3> 
  <pre><? var_dump($this->request->getParams()) ?> 
  </pre> 
  <? //endif ?>

En cas d'une erreur genre controller qui n'existe pas ou autre page non trouvé je tombe sur une page :

Code:

An error occurred

Exception information:

Message: 
Fatal error: Call to a member function getMessage() on a non-object in /Applications/MAMP/htdocs/zfexemple/trunk/application/views/scripts/error/error.phtml on line 9

Pour les erreurs de permission j'ai

Notice: Trying to get property of non-object in

Code:

/Applications/MAMP/htdocs/zfexemple/trunk/application/controllers/ErrorController.php on line 48
An error occurred

Exception information:

Message: 
Fatal error: Call to a member function getMessage() on a non-object in /Applications/MAMP/htdocs/zfexemple/trunk/application/views/scripts/error/error.phtml on line 9

Voici le code de mon plugin pour les ACL:

Code:

<?php
 
class My_Controller_Plugin_Auth extends Zend_Controller_Plugin_Abstract
{
    public function preDispatch(Zend_Controller_Request_Abstract $request)
    {
        $user = Zend_Auth::getInstance();
        if($user->hasIdentity()) {
            $userRoleId = $user->getIdentity()->acl_roleid;
        } else {
            $userRoleId = 1; //Visiteur
        }
        $acl = My_Acl::getInstance();
        $request = $this->getRequest();
 
        if (!$acl->hasRole($userRoleId)) {
              $error = "Sorry, the requested user role '".$userRoleId."' does not exist";                                    
          }
          if (!$acl->has($request->getModuleName().'_'.$request->getControllerName())) {
            $error = "Sorry, the requested controller '".$request->getControllerName()."' does not exist as an ACL resource";
         }
        if (!$acl->isAllowed($userRoleId, $request->getModuleName().'_'.$request->getControllerName(), $request->getActionName())) {
            $error = "Sorry, the page you requested does not exist or you do not have access";
        }
 
        if (isset($error)) {
            Zend_Layout::getMvcInstance()->getView()->error = $error;
            $request->setControllerName('error');
            $request->setActionName('error');
            $request->setDispatched(false);
        }
 
    }
 
}

donc je renseigne une variable error et je balance l'erreur dans la vue error il me semble non?

mon bootstrap :

Code:

<?php 
// ** Check to see if the environment is already setup **
if (isset($bootstrap) && $bootstrap) { 
    // Enable all errors so we'll know when something goes wrong. 
    error_reporting(E_ALL | E_STRICT);  
    ini_set('display_startup_errors', 1);  
    ini_set('display_errors', 1); 
 
    // Add our {{library}} directory to the include path so that PHP can find the Zend Framework classes.
    // you may wish to add other paths here, or keep system paths: set_include_path('../library' . PATH_SEPARATOR . get_include_path() 
    set_include_path('../library');  
 
    // Set up autoload. 
    // This is a nifty trick that allows ZF to load classes automatically so that you don't have to litter your 
    // code with 'include' or 'require' statements. 
    require_once "Zend/Loader.php"; 
    Zend_Loader::registerAutoload(); 
    Zend_Loader::loadClass('Zend_Db_Table');
    Zend_Loader::loadClass('Zend_Debug');
    Zend_Loader::loadClass('Zend_Auth');
//    Zend_Loader::loadClass('Zend_Acl');

    Zend_Loader::loadClass('My_Acl');
} 

 
// ** Get the front controller ** 
// The Zend_Front_Controller class implements the Singleton pattern, which is a design pattern used to ensure 
// there is only one instance of Zend_Front_Controller created on each request. 
$frontController = Zend_Controller_Front::getInstance(); 
 

// Point the front controller to your action controller directory. 
$frontController->setControllerDirectory('../application/controllers'); 
$frontController->registerPlugin(new My_Controller_Plugin_Auth()); 



// Set the current environment 
// Set a variable in the front controller indicating the current environment -- 
// commonly one of development, staging, testing, production, but wholly 
// dependent on your organization and site's needs. 
$frontController->setParam('env', 'development');

//$frontController->throwExceptions(TRUE);

//lecture config
$config = new Zend_Config_Ini('../application/configs/config.ini', 'general');
Zend_Registry::set('config', $config);

Zend_Layout::startMvc($config->layout);

//$frontController->throwExceptions(true);

//connexion Mysql
$db = Zend_Db::factory($config->db->adapter,
$config->db->params->toArray());
Zend_Db_Table::setDefaultAdapter($db);

Zend_Registry::set('dbAdapter', $db);
// setup controller
$frontController = Zend_Controller_Front::getInstance();

Quand j'ajoute dans le bootstrap :

Code:

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

mais apres coté ACL c'est la panique j'ai sur toutes mes pages:

Code:

Fatal error: Call to a member function fetchAll() on a non-object in /Applications/MAMP/htdocs/zfexemple/trunk/library/My/Acl.php on line 18

mon Acl.php

Code:

<?php
 
class My_Acl extends Zend_Acl {
 
    protected static $_instance = null;
 
    private function __construct()
    {}
 
    private function __clone()
    {}
 
    protected function _initialize()
    {
 
        $db = Zend_Db_Table::getDefaultAdapter();
 
        $roles = $db->fetchAll("SELECT
                acl_role_privilege.acl_role_id, 
                acl_module.acl_module_name,
                acl_resource.acl_resource_name,
                acl_privilege.acl_privilege_name
                FROM acl_role_privilege
                INNER JOIN acl_privilege 
                ON acl_role_privilege.acl_privilege_id = acl_privilege.acl_privilege_id
                INNER JOIN acl_resource
                ON acl_privilege.acl_resource_id = acl_resource.acl_resource_id
                INNER JOIN acl_module
                ON acl_resource.acl_module_id = acl_module.acl_module_id");
 
        foreach ($roles as $role) {
            if (!$this->has($role['acl_module_name'].'_'.$role['acl_resource_name'])) {
                $this->add(new Zend_Acl_Resource($role['acl_module_name'].'_'.$role['acl_resource_name']));
            }
            if (!$this->hasRole($role['acl_role_id'])) {
                $this->addRole(new Zend_Acl_Role($role['acl_role_id']));
            }
        }
 
        $this->deny();
        $this->allow(null, 'default_error');
 
        foreach ($roles as $role) {
            $this->allow($role['acl_role_id'], $role['acl_module_name'].'_'.$role['acl_resource_name'], $role['acl_privilege_name']);
        }
 
    }
 
    public static function getInstance()
    {
       if (null === self::$_instance) {
        self::$_instance = new self();
        self::$_instance->_initialize();
       }
 
       return self::$_instance;
    }
 
}

Donc si vous avez une idée je suis partant smile

Dernière modification par creatix (12-02-2009 17:59:28)

Hors ligne

 

#2 12-02-2009 17:58:49

creatix
Membre
Date d'inscription: 03-08-2008
Messages: 17

Re: [résolu]Gestion des exceptions...

c'est bon pour les exceptions dans mon index.php en dessous de mon bootstrap j'avais :
   

Code:

$frontController->dispatch();

donc forcément pas terrible. et j'ai changé aussi dans auth.php pour ne plus mettre rien dans la variable error mais plutôt levé des exceptions.

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