WEBアプリケーション研究室 開発ノート TOP

WEBアプリケーション研究室 開発ノート [Zend Framwork] Action内で発生した例外について

スポンサーサイト

-------- --:--

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

    このエントリーをはてなブックマークに追加

Zend_Controllerではエラーハンドラを設定しておくとAction内で発生した例外及びコントローラーやアクションが見つからなかった場合の処理を一つのアクションに全部集めて処理ができます。

注意が必要なのはアクション内でもinit()で投げる時は注意が必要です。Zend_Controller_Actionを継承したMyControllerActionを作って重複コードを集め、全てのActionはそいつから派生させようという場合ErrorControllerも同じコントローラーから派生させるとうまくいかなくなります。


class MyControllerAction extends Zend_Controller_Action
{
public function init()
{
trown new Exception('error!!');
}




class Cli_ErrorController extends MyControllerAction
{
public function indexAction()
{



こうするとディスパッチループの中で最初のコントローラーをnewした時とエラーコントローラーをnewした時、2回同じ例外が投げられることになります。このままだと無限ループになってしまうのでZend_Controller_Plugin_ErrorHandlerでは2度目の例外はそのまま投げるようにしています。

if ($this->_isInsideErrorHandlerLoop) {
$exceptions = $response->getException();
if (count($exceptions) > $this->_exceptionCountAtFirstEncounter) {
// Exception thrown by error handler; tell the front controller to throw it
$frontController->throwExceptions(true);
throw array_pop($exceptions);
}
}
エラーハンドラにかかわらずアクションの親クラスのinit()は2度呼ばれる可能性があるので注意が必要だと思います。
スポンサーサイト

    このエントリーをはてなブックマークに追加
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。