Nullyのぶろぐ

仙台で働くエンジニアの日記

Zend Frameworkで例外処理をちょっとだけ便利にする方法

Zend Frameworkを使ってて、モジュール毎だろうとなんだろうと、ErrorControllerを利用すると思います。

そのErrorController内では例外のタイプ(Zend_Controller_Plugin_ErrorHandler内で定義された定数)によってメッセージを変えたりしています。

が、自分で定義した例外をガンガン投げる場合も結構あったりします。

そんな場合の対処法を覚書として[wp_emoji2 code="d214" alt="鉛筆"]

どうやるか

まずは以下の例外クラスがあったとします。

class Nully_Exception_UnkoException extends Zend_Exception {}

単純にZend_Exceptionを継承しているだけです。

次に、ControllerやServiceクラスなどから上の例外を投げます。

throw new Nully_Exception_UnkoException("Nullyはう◯こです。");

すると、いつものとおり、ErrorControlelrにdispatchしなおしてくれます。

いつもだと(zfコマンドから作った場合とか)、errorActionの中には、リクエストのパラメータからエラーハンドリングの結果オブジェクトを取得し、そのオブジェクトのtypeメンバを利用して振り分けていました。

public function errorAction() {

$error = $this->_request->getParam("error_handler");

switch($error->type) {

case Zend_Controller_Plugin_ErrorHandler::EXCEPTION_NO_ROUTE:

:

:

: コードが続く

:

:

}

}

このswitchの部分をちょこっと直します。

errorActionを少し書きなおす

「$error->type」として判別しようとしていますが、これを「get_class($error->exception)」として上げます。

$error->exceptionの中には最後に投げられた例外クラスオブジェクトが入ってます。

なので、クラス名を取得してしまえば、後はswitchにガリガリ書き足していきます。

で、さすがにcase文が増えるとカオスになるので、以下のように_forwardでアクションをフォワーディングしてあげます。

case "Nully_Exception_UnkoException":

$this->_forward("nully-unko");

break;

後はフォワーディング先のアクション及びビューを準備してあげれば、例外毎の表示割り振り等も簡単に行えます。

ビュースクリプト

<h2><?= $this->message; ?></h2>

<pre>

  ::::::::::::::::::::                        ::::::::::/ ):::::::::

:::::(\:::::::                _人           / / ):::::::::::

:::::/\\             ノ⌒ 丿        /  / /ヽ::::::::::::

:::: ヽ \\         _/   ::(        /  / / /::::::::::::::::

:::: ( \ \\      /     :::::::\      l  三 / / ):::::::::::::::

:::::::ヽ ヽ . ミヽヽ     (     :::::::;;;;;;;)    /   二 / /::::::::::::::::::

::::::: ( \ ヽミ ヽヽ    \_―― ̄ ̄::::::::::  /    二 ___/ヽ ...::::::::::::::

::::... /ヽ ヽ ニ ヽヽ  ノ ̄     :::::::::::::: //   ニ _______/   ...:::::::::

:::.   ヽ____  ニ ヽ (     .::::::::::::::;;;;//    ニ ____ノ     .....::::::::::

      ヽ___,  ニ/ ̄――――― ̄ ̄::::::::\ ニ ___ノ +   + ....:::::::::

        ヽニ -‐(        :::::::::::::::::::::::::::::::::≡ __ノ+ ┼ *:::::::::

         ヽ---\__::::::::::::::::::;;;;;;;;;;;;;;;;;;;;;;;;ノ_ +  ┼  .::::::::::

 :::::...     + ┼ +   +    ー-、___~'''''ー-、   :....::::::::::::

  :::::::....     + ┼    *+     +~~'''ヽ ..:...::::::::::::::::::::

   :::::::::::::::::.....    +   * .   ┼  :....:::::::::::::::::

    ::::::::::::::::::::....: + *     +   .....:::::::::::::::::

</pre>

アクション

public function nullyUnkoAction() {

// ここでエラーアクションで利用するコードなどを記述

}

最後に

あまりいい方法とは言えませんが、Zend Frameworkのコア部分に極力手をかけず、手間をかけないでやるにはまぁ良い手法かな?と思います。

というか、ZFユーザーの方々がどうやって自前例外をハンドリングしてるか気になります...。