エラーハンドラ
Zend Frameworkのエラーハンドラを使ってみました。
今回の環境はZend Frameworkのバージョンが1.6です。
コントローラー
まず、エラー用のコントローラーを実装します。今回の例では、不正コントローラーの場合(error/404.phtml)とその他のエラーで別のView(error/error.phtml)を表示するようにしました。
<?php require_once 'Zend/Controller/Action.php'; defined('APPLICATION_PATH') or define('APPLICATION_PATH', dirname(__FILE__) . '/..'); class ErrorController extends Zend_Controller_Action { public function indexAction() { } public function errorAction() { $this->_helper->viewRenderer->setNoRender(); $v = new Zend_View(); $v->setScriptPath(APPLICATION_PATH . '/views/scripts'); $request = $this->getRequest(); $handler = $request->getParam('error_handler'); $exception = $handler['exception']; $v->message = $exception->getMessage(); $v->exception = $exception; if($handler->type == 'EXCEPTION_NO_CONTROLLER') $this->getResponse()->setBody($v->render('error/404.phtml')); else $this->getResponse()->setBody($v->render('error/error.phtml')); $this->getResponse()->setHeader('Content-type', 'text/html;charset=utf8'); } } ?>
-
- レンダラーを使わず、レスポンスのボディとしてViewで生成した内容を設定しています。
- error_handlerというパラメータでエラー情報が渡ってくるので、その情報をViewにわたしています。
ViewにSmartyを使う場合は以下のように。先日作成したSmarty用のViewクラスを使っています。
defined('SMARTY_PATH') or define('SMARTY_PATH', APPLICATION_PATH . '/smarty'); defined('SMARTY_TEMPLATE_PATH') or define('SMARTY_TEMPLATE_PATH', APPLICATION_PATH . '/views/templates'); require_once 'Zend/View/Smarty.php'; .....省略...... public function errorAction() { $this->_helper->viewRenderer->setNoRender(); $v = new Zend_View_Smarty(SMARTY_TEMPLATE_PATH); $v->setBasePath(SMARTY_PATH); $request = $this->getRequest(); $handler = $request->getParam('error_handler'); $exception = $handler['exception']; $v->message = $exception->getMessage(); $v->exception = $exception; if($handler->type == 'EXCEPtiON_NO_CONTROLLER') $this->getResponse()->setBody($v->render('error/404.html')); else $this->getResponse()->setBody($v->render('error/error.html')); $this->getResponse()->setHeader('Content-type', 'text/html;charset=utf8'); }
エラーハンドラーの登録
index.phpでエラーハンドラーの登録を行います。指定した名前のコントローラー、アクションが実行されるようエラーハンドラーを生成して登録しています。
require_once 'Zend/Controller/Plugin/ErrorHandler.php'; $frontController->registerPlugin( new Zend_Controller_Plugin_ErrorHandler( array( 'controller' => 'error', 'action' => 'error' ) ) );