Consultez la FAQ sur le ZF avant de poster une question
Vous n'êtes pas identifié.
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
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)
<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 :
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
/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:
<?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 :
<?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 :
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:
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
<?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
Dernière modification par creatix (12-02-2009 17:59:28)
Hors ligne
c'est bon pour les exceptions dans mon index.php en dessous de mon bootstrap j'avais :
$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