エラーハンドラ

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');
	}
}
?>
    1. レンダラーを使わず、レスポンスのボディとしてViewで生成した内容を設定しています。
    2. 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'
			)
		)
	);