今回は、やりたいことの2つ目、3つ目に入っていた
2.プログラムが必要ない場合は、Actionコントローラーを書きたくない
(Actionメソッドがなくても、テンプレートが表示されるようにしたい)
3.テンプレートもないURLが指定されたら、トップページなど指定のURLに遷移させたい
を実現する方法です。
Zendは、初期状態で、ErrorHandlerプラグインというプログラムが有効になっています。
これは、プログラム実行中に、エラーが発生した場合、
ErrorActionコントローラーのerrorActionというメソッドをよびだしてくれます。
そこで、コントローラークラスが見つからなかった場合、
アクションメソッドが見つからなかった場合の判別が可能です。
私が作った、ErrorActionクラスから必要な部分を抜き出したのが以下です。
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;
}
}
}