この状態でもう一度 http://<host名>/zf2/index/hoge/ へアクセスすると、今度は以下のような表示になるはずです。
このように、発生したエラーはErrorController::errorActionで処理させるのがZend_Controllerの標準的な例外処理になります。この仕組みは、Zend Frameworkに標準で添付されている「エラーハンドラ」コントロールプラグインの機能により提供されています。詳細はリファレンスガイドの「7.12. MVC での例外」や「7.10.5. 標準の配布パッケージに含まれるプラグイン」を参照してください。
さて、上の例では、未実装のアクションを呼び出すことで例外を発生させましたが、場合によっては未実装のアクションを例外にせず、他の動作に付け替えたい場合もでてくるかもしれません。
このような場合は、PHP5の標準的な機能である「__call」マジックメソッドを利用できます。__callは、未定義のメソッドが呼び出された場合にオーバーロードとして呼び出されるメソッドです。(「オーバーロード」の意味合いが、たとえばC#のようなほかのプログラミング言語と違う点に注意してください)
__callメソッドのシグニチャは以下のように定義されています。
mixed __call ( string $name, array $arguments )第一引数の「$name」は呼び出された(存在しない)メソッドの名前、第二引数は呼び出しに使用された引数のリストになります。
ここでは、「未定義のアクションが呼び出されたら、デフォルトアクション(=indexAction)を代わりに実行する」ようにしてみます。追加するコードはシンプルです。
<?php require_once 'Zend/Controller/Action.php'; class IndexController extends Zend_Controller_Action { // 初期化処理 public function init() { // BASE要素向けのベースURL $this->view->assign( 'baseUrl', getApplicationUrl( $this->getRequest() ) ); } // indexアクション public function indexAction() { } // dumpアクション public function dumpAction() { $this->view->assign( 'postData', $this->getRequest()->getPost() ); } // __callオーバーロード public function __call($name, $args) { // indexアクションへ処理を委譲 $this->_forward( 'index' ); } }
アクションコントローラ内で、あるメソッドから他のアクションメソッドへ処理を委譲する場合は「_forward」メソッドを使用します。「_forward」メソッドはZend_Controller_Actionに実装されたプロテクトメソッドで、シグニチャは以下のようになっています。
final protected function _forward($action, $controller = null, $module = null, array $params = null)
セコメントをする