Bei größeren Projekten kommt man evtl. auf die Idee das Errorhandling der Webapplikation in ein eigenes Modul auszulagern. Mit Hilfe des Zend Frameworks sind dazu drei Schritte notwendig:
- Error-Modul anlegen
- Error-Plugin zum Setzen des Standard-Error-Moduls
- application.ini und Bootstrap.php der Anwendung konfigurieren
Beginnen wir mit dem Error-Modul. Im Ordner modules legen wir ein neues Modul Error an (vgl. Tutorial 1 Punkt 4). Das Modul benötigt zunächst einen IndexController:
class Error_IndexController extends Zend_Controller_Action { public function indexAction() { $errors = $this->_getParam('error_handler'); if (!$errors || !$errors instanceof ArrayObject) { $this->view->message = 'You have reached the error page'; return; } //Fehlermeldung abhängig vom Typ in das Messageobjekt schreiben switch ($errors->type) { case Zend_Controller_Plugin_ErrorHandler::EXCEPTION_NO_ROUTE: case Zend_Controller_Plugin_ErrorHandler::EXCEPTION_NO_CONTROLLER: case Zend_Controller_Plugin_ErrorHandler::EXCEPTION_NO_ACTION: // 404 error -- controller or action not found $this->getResponse()->setHttpResponseCode(404); $priority = Zend_Log::NOTICE; $this->view->message = 'Page not found'; break; default: // application error $this->getResponse()->setHttpResponseCode(500); $priority = Zend_Log::CRIT; $this->view->message = 'Application error'; break; } // Log exception, if logger available if ($log = $this->getLog()) { $log->log($this->view->message, $priority, $errors->exception); $log->log('Request Parameters', $priority, $errors->request->getParams()); } // conditionally display exceptions if ($this->getInvokeArg('displayExceptions') == true) { $this->view->exception = $errors->exception; } $this->view->request = $errors->request; } /** * * Erzeugt ein Logging-Element * @return $log */ public function getLog() { $bootstrap = $this->getInvokeArg('bootstrap'); if (!$bootstrap->hasResource('Log')) { return false; } $log = $bootstrap->getResource('Log'); return $log; } }
Passend dazu benötigen wir eine index.phtml im View-Scripts Ordner:
<h1>An error occurred</h1> <h2><?php echo $this->message ?></h2> <?php if (isset($this->exception)): ?> <h3>Exception information:</h3> <p> <b>Message:</b> <?php echo $this->exception->getMessage() ?> </p> <h3>Stack trace:</h3> <pre><?php echo $this->exception->getTraceAsString() ?> </pre> <h3>Request Parameters:</h3> <pre><?php echo $this->escape(var_export($this->request->getParams(), true)) ?> </pre> <?php endif ?>
Für das Errormodul benötigen wir nun lediglich noch die Bootstrap-Datei, damit das Modul einwandfrei funktionieren kann:
class Error_Bootstrap extends Zend_Application_Module_Bootstrap { }
Damit das Error-Handling auch korrekt an das Modul weitergeleitet wird, ist ein Plugin notwendig. Wir erzeugen im Plugin-Ordner einen Ordner Controller. In diesen Ordner legen wir unsere Plugin-Datei ErrorControllerSelector.php ab:
class Plugin_Controller_ErrorControllerSelector extends Zend_Controller_Plugin_Abstract { public function routeShutdown(Zend_Controller_Request_Abstract $request) { $front = Zend_Controller_Front::getInstance(); $error = $front->getPlugin('Zend_Controller_Plugin_ErrorHandler'); $error->setErrorHandlerModule("Error"); $error->setErrorHandlerController("index"); $error->setErrorHandlerAction("index"); } }
Im Schritt 3 passen wir jetzt unseren Applikationskontext an. Fügt eurer application.ini folgende Zeilen hinzu:
autoloaderNamespaces[] = "Error_" autoloaderNamespaces[] = "Plugin_"
Die Bootstrap.php der Anwendung wird um die Methode _initPlugins() erweitert und lädt uns das eben angelegte Plugin:
protected function _initPlugins() { $this->bootstrap('frontController'); $this->getResource('frontController') ->registerPlugin(new Plugin_Controller_ErrorControllerSelector()); }
Damit habt ihr das Error-Handling eurer Webapplikation in ein extra Modul ausgelagert.