1月 31, 2008
Zend_ViewでSmartyをラップする6
今回は、やりたいことの2つ目、3つ目に入っていた
2.プログラムが必要ない場合は、Actionコントローラーを書きたくない
(Actionメソッドがなくても、テンプレートが表示されるようにしたい)
3.テンプレートもないURLが指定されたら、トップページなど指定のURLに遷移させたい
を実現する方法です。
Zendは、初期状態で、ErrorHandlerプラグインというプログラムが有効になっています。
これは、プログラム実行中に、エラーが発生した場合、
ErrorActionコントローラーのerrorActionというメソッドをよびだしてくれます。
そこで、コントローラークラスが見つからなかった場合、
アクションメソッドが見つからなかった場合の判別が可能です。
私が作った、ErrorActionクラスから必要な部分を抜き出したのが以下です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | class ErrorController extends Zend_Controller_Action { public function errorAction() { $errors = $this->_getParam('error_handler'); switch ($errors->type) { case Zend_Controller_Plugin_ErrorHandler::EXCEPTION_NO_CONTROLLER: if ($this->_getParam('action') == 'index') { $view = $this->getHelper('viewRenderer'); $view->setNoController() ->setScriptAction($this->_getParam('controller')); } case Zend_Controller_Plugin_ErrorHandler::EXCEPTION_NO_ACTION: if (!isset($view)) { $view = $this->getHelper('viewRenderer'); $this->getRequest()->setControllerName($this->_getParam('controller')); $this->getRequest()->setActionName($this->_getParam('action')); } $template = $view->getViewBasePathSpec() . $view->getViewScript(); if (!is_readable($template)) $this->_redirect('/'); break; default: break; } } } |