WEBサービス創造記

WEBサービスを作ったり保守したりしてる人のメモブログです。

ZendFrameworkでエラーコントローラを用いてエラーを処理をする

      2012/12/17

ZendFrameworkでのデバッグ

ZendFrameworkで構築したアプリケーションは、デフォルトではエラーがZend_Controllerのdispatchのエラーに帰着してしまうため、出力されるエラーメッセージを見ても解決の糸口を見つけることが困難です。

そこで、エラーコントローラというものでエラーを処理してデバッグを行いやすい環境を構築します。

エラーコントローラでのエラー処理

ZendFrameworkでは、エラーコントローラという仕組みを用いてエラーを処理することができます。

エラーコントローラは、存在しないアクションが呼び出された場合や、アプリケーションの処理中に例外が発生した場合などのエラー時の挙動を定義するものです。

エラーコントローラは通常のアクションコントローラと同じく、アプリケーションディレクトリ直下の controllers ディレクトリに配置します。

 
-application/
  |_ controllers/
  |   |_ IndexController.php
  |   |_ ErrorController.php
  |- views/
     |-scripts 
       |_ index/
       |   |_index.phtml
       |_ error/
           |_error.phtml

コントローラ名とアクション名はいずれも”error”となります。
ビュースクリプトはコントローラ名・アクション名にあわせて”error”というディレクトリ・ファイル名となります。

ここでは、下記のようなエラーコントローラを用意して、動作を確認してみました。

ErrorController.php
<?php echo '<?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; 
        }   
    }   
}
error.phtml
<!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 その他の例外

上記スクリプト設置後、意図的に例外を発生させたり、ブラウザのアドレスバーに存在しないコントローラ名・アクション名を指定してみたりしてください。
エラーコントローラがエラーを処理するようになっていると思います。

このスクリプトでは便宜上エラーメッセージをブラウザに出力するようにしていますが、本運用時はエンドユーザにエラーメッセージが見えないようにしてログに記録するなどの処理にしたほうがいいかもしれません。

 - ZendFramework , , ,