2010年2月6日土曜日

ErrorController指定とFrontControllerの取得の仕方

 Zend Frameworkでは、ActionControllerでExceptionが発生した場合、Zend_Controller_Plugin_ErrorHandlerが例外をキャッチし、処理をErrorControllerのerrorメソッドに移動する。

モジュール構成にしている場合でも、何もしないと、必ずDefaultモジュールのErrorContorllerに処理が移るので、モジュール別にエラーページを切り分ける必要がある場合は、移動先を変更する必要がある。

やり方がわかったので、とりあえずメモ。

Zend_Controller_Plugin_ErrorHandlerには、以下の3つのメソッドがあるので、エラーが発生する前に移動先を決めることができる。

  • setErrorHandlerModule() //モジュールを変更する
  • setErrorHandlerController() //コントローラを変更する
  • setErrorHandlerAction() //アクションを変更する

設定の仕方は以下のとおり
  1. FrontControllerのオブジェクトを取得
  2. FrontControllerに設定されているZend_Controller_Plugin_ErrorHandlerをgetPlugin()で取得
  3. 取得したErrorHandlerのオブジェクトに対して、移動先を設定。

(コード例)
$front=Zend_Controller_Front::getInstance();
$plugin=$front->getPlugin('Zend_Controller_Plugin_ErrorHandler');
$plugin->setErrorHandlerAction('errorhoge');


モジュール別や特定の条件で分けることが決まっているならば、BootStrap中か、自前でプラグインを用意し、dispatchLoopStartup($request)で、指定しておけばよい。



ついでに、FrontControllerの取得方法がよくわからなかったのでとりあえずメモ

[FrontControllerの取得方法]
(1)どこからでも
$front=Zend_Controller_Front::getInstance();


(2)ActionControllerの中で
(2-1)ActionControllerのgetFrontController()を利用して
$front=$this->getFrontController();

(2-2)Bootstrapのリソース経由で

$bootstrap=$this->getInvokeArg('bootstrap');
$front=$bootstrap->getResource('frontController');
(2-3)Bootstrapnoコンテナ経由で
$bootstrap=$this->getInvokeArg('bootstrap');
$container=$bootstrap->getContainer();
if(isset($container->frontcontroller)){
$front=$container->frontcontroller;
$plugin=$front->getPlugin('Zend_Controller_Plugin_ErrorHandler');
$plugin->setErrorHandlerAction('errorhoge');
}
(3)Bootstarpの処理の中で
$this->bootstrap('FrontController');
$this->getResource('FrontController');


Zend_Controller_Plugin_ErrorHandlerはFrontControllerでdispatchされたときに自動的に設定されるようになっている。
BootStrapはフロントコントローラのdispatch前なので、Bootstrap中の処理ではフロントコントローラーに何もPluginに設定されていない。
この為、BootStrap中にErrorHandlerの設定を変更したい場合は、自分でErrorHandlerのオブジェクトを生成して、設定する必要がある。

(コード例)
$this->bootstrap('FrontController');
$front=$this->getResource('FrontController');
if($front->hasPlugin('Zend_Controller_Plugin_ErrorHandler')){
$plugin =$front->getPlugin('Zend_Controller_Plugin_ErrorHandler');
}else{
$plugin=new Zend_Controller_Plugin_ErrorHandler();
$front->registerPlugin($plugin, 100);
}
$plugin->setErrorHandlerAction('errorhoge');

0 件のコメント: