モジュール構成にしている場合でも、何もしないと、必ずDefaultモジュールのErrorContorllerに処理が移るので、モジュール別にエラーページを切り分ける必要がある場合は、移動先を変更する必要がある。
やり方がわかったので、とりあえずメモ。
Zend_Controller_Plugin_ErrorHandlerには、以下の3つのメソッドがあるので、エラーが発生する前に移動先を決めることができる。
- setErrorHandlerModule() //モジュールを変更する
- setErrorHandlerController() //コントローラを変更する
- setErrorHandlerAction() //アクションを変更する
設定の仕方は以下のとおり
- FrontControllerのオブジェクトを取得
- FrontControllerに設定されているZend_Controller_Plugin_ErrorHandlerをgetPlugin()で取得
- 取得した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');(2-3)Bootstrapnoコンテナ経由で
$front=$bootstrap->getResource('frontController');
$bootstrap=$this->getInvokeArg('bootstrap');(3)Bootstarpの処理の中で
$container=$bootstrap->getContainer();
if(isset($container->frontcontroller)){
$front=$container->frontcontroller;
$plugin=$front->getPlugin('Zend_Controller_Plugin_ErrorHandler');
$plugin->setErrorHandlerAction('errorhoge');
}
$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 件のコメント:
コメントを投稿