ZendFrameworkでのデバッグ
ZendFrameworkで構築したアプリケーションは、デフォルトではエラーがZend_Controllerのdispatchのエラーに帰着してしまうため、出力されるエラーメッセージを見ても解決の糸口を見つけることが困難です。
そこで、エラーコントローラというものでエラーを処理してデバッグを行いやすい環境を構築します。
エラーコントローラでのエラー処理
ZendFrameworkでは、エラーコントローラという仕組みを用いてエラーを処理することができます。
エラーコントローラは、存在しないアクションが呼び出された場合や、アプリケーションの処理中に例外が発生した場合などのエラー時の挙動を定義するものです。
エラーコントローラは通常のアクションコントローラと同じく、アプリケーションディレクトリ直下の controllers ディレクトリに配置します。
-application/
|_ controllers/
| |_ IndexController.php
| |_ ErrorController.php
|- views/
|-scripts
|_ index/
| |_index.phtml
|_ error/
|_error.phtml
コントローラ名とアクション名はいずれも"error"となります。
ビュースクリプトはコントローラ名・アクション名にあわせて"error"というディレクトリ・ファイル名となります。
ここでは、下記のようなエラーコントローラを用意して、動作を確認してみました。
<?php
require_once 'Zend/Controller/Action.php';
require_once 'Zend/Controller/Plugin/ErrorHandler.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_ROUTE:
case Zend_Controller_Plugin_ErrorHandler::EXCEPTION_NO_CONTROLLER:
case Zend_Controller_Plugin_ErrorHandler::EXCEPTION_NO_ACTION:
// コントローラもしくはアクションが存在しない場合
$this->view->msg = 'リクエストされたコントローラ・アクションは存在しません。';
break;
default:
// アプリケーションの処理中に発生したエラーの処理
$this->view->msg = $errors->exception->getMessage();
break;
}
}
}
<!DOCTYPE HTML>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>Error!</title>
</head>
<body>
{$msg}
</body>
</html>
エラーオブジェクトを取得したら $errors->type でその型を調べることができるので、その結果に応じてスイッチしています。
typeプロパティの戻り値は以下のいずれかになります。
| 戻り値 | 意味 |
|---|---|
| Zend_Controller_Plugin_ErrorHandler::EXCEPTION_NO_ROUTE | 一致したルートが見つからない |
| Zend_Controller_Plugin_ErrorHandler::EXCEPTION_NO_CONTROLLER | コントローラが見つからない | Zend_Controller_Plugin_ErrorHandler::EXCEPTION_NO_ACTION | アクションが見つからない |
| Zend_Controller_Plugin_ErrorHandler::EXCEPTION_OTHER | その他の例外 |
上記スクリプト設置後、意図的に例外を発生させたり、ブラウザのアドレスバーに存在しないコントローラ名・アクション名を指定してみたりしてください。
エラーコントローラがエラーを処理するようになっていると思います。
このスクリプトでは便宜上エラーメッセージをブラウザに出力するようにしていますが、本運用時はエンドユーザにエラーメッセージが見えないようにしてログに記録するなどの処理にしたほうがいいかもしれません。

この記事へのコメント
まだコメントは投稿されていません。