ZendFramework入門・その4 フォームを取り扱う・その2
2007-09-10


この状態でもう一度 http://<host名>/zf2/index/hoge/ へアクセスすると、今度は以下のような表示になるはずです。

以下のエラーが発生しました

index/hoge
「hogeActionが存在しない」旨のメッセージが表示されたはずです。

このように、発生したエラーは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' );
        }
}

IndexController.php(__callを追加)
上記の__callをIndexControllerに追加してhttp://<host名>/zf2/index/hoge/ へアクセスすると、先ほどはエラーが表示されていたのが、今度はindex/indexにアクセスした場合と同じ表示になります。つまりindex/hoge の呼び出しを index/index に付け替えたということです。

_forward プロテクトメソッド

アクションコントローラ内で、あるメソッドから他のアクションメソッドへ処理を委譲する場合は「_forward」メソッドを使用します。「_forward」メソッドはZend_Controller_Actionに実装されたプロテクトメソッドで、シグニチャは以下のようになっています。

final protected function _forward($action, $controller = null, $module = null, array $params = null)


続きを読む
戻る
[PHP]
[Zend Framework]
[Zend Framework 入門]

コメント(全2件)
コメントをする


記事を書く
powered by ASAHIネット