[ Zend Framework1 ] 別アクションへフォワード する ( _forward )

Pocket

Zend Framework1 では他のフレームワードと同じく、URL とクラスメソッドをマッピングさせることができます。ここでは、マッピングされたメソッド(アクション)から別のアクションの呼び出し方について記載しています。なお、動作確認は Zend Framework 1.11 で行っています。

スポンサーリンク

別アクションを呼び出す _forward メソッド

別アクション(別 URL にマッピングされたクラスメソッド)を呼び出すには _forward メソッドを使用します。下記がそのサンプルになります。詳細はサンプル内のコメントを参照ください。

URI : http://localhost/sample/index にリクエストを送ると、マッピングされた index アクションがフレームワークによって呼び出されます。そして、index アクションから test アクションを呼び出して(遷移)います。

// アクションコントローラ
class SampleController extends Zend_Controller_Action
{
    private $_msg = '';

    public function init()
    {
        /* この位置でアクションコントローラの初期化を行う */
        $this->_msg .= 'init';
    }

    public function preDispatch()
    {
        // 各アクションの前に呼び出される
        $this->_msg .= 'preDispatch';
    }

    /**
     * Index アクション本体
     */
    public function indexAction()
    {
        // action body
        $this->_msg .= 'indexAction';

        // Test アクションに forward する
        // パラメータなし、同一コントローラ内のアクションであれば以下でも呼び出し可能
        //$this->_forward( 'test' ); 
      
        // パラメータを付与して Test アクションを呼び出す
        $params = array('param' => 'value');
        $this->_forward( 'test', 'sample', null, $params);

        // この位置の処理は行われる
        echo "indexAction end" . $this->_msg;
    }

    /**
     * Test アクション本体
     */
    public function testAction()
    {
        // パラメータを取得
        $prm = 'param = ' . $this->_request->getParam('param');
        $this->_msg .= 'testAction:' . $prm;

        echo "testAction end" . $this->_msg;
    }

    public function postDispatch()
    {
        // 各アクションの後に呼び出される
        $this->_msg .= 'postDispatch';
    }
}

実行結果

init
preDispatch
indexAction
indexAction end
init
preDispatch
testAction:param = value
testAction end

この結果から以下の点を読み取ることができます。

  • _forward 転送はすぐさま別アクションが呼び出されるわけではなく、_forward メソッド呼出し後も そのアクションは最後まで処理が行われる
  • _forward による転送が行われると、再度 init, preDispatch, 転送したアクション本体の順にアクションコントローラが呼び出される。(メンバ変数なども初期化される)

なお、それぞれ postDispatch も呼び出されていることは別途確認済みです。

また、ブラウザの URL を見ると Test アクションが実行されているが http://localhost/sample/index のままであることも確認できます。あくまで Index アクションの一連の処理としてサーバで実行されていることがわかります。

preDispatch メソッドから別アクションを呼び出す

preDispatch メソッドで _forward メソッドを使って別アクションを呼び出すと、元々呼び出すアクションの処理がスキップされ、_forward メソッドで呼び出したアクションが実行されます。下記のサンプルコードは、上記サンプルの preDispatch メソッドを修正し、http://localhost/sample/index にリクエストした場合の動作を確認しています。

※ なお、init メソッドでは、_forward メソッドの呼び出しは正常に動作しません。

    public function preDispatch()
    {
        $this->_msg .= 'preDispatch Start';

        // アクション名を取得する
        $action = $this->getRequest()->getActionName();
    
        // index アクションの場合は Test アクションを呼び出す
        if($action === 'index') {
            // Test アクションを呼び出す
            $params = array('param' => 'value');
            $this->_forward( 'test', 'sample', null, $params);

            // Test アクションにリダイレクトする場合
            //$this->_redirect('http://localhost/public/sample/test/param/value');
        }
        $this->_msg .= 'preDispatch End';
    }

実行結果

init
preDispatch Start
preDispatch End
testAction:param = value
testAction end

この結果から Index アクションがスキップされ、Test アクションが実行されていることが確認できます。また、サンプル内にコメントしていますが、_redirect メソッドを使用しても別アクションを呼び出すことができます。ただし、一度ブラウザに制御が戻るためブラウザ上の URL は _forward メソッドと異なりリダイレクト先の URL が表示されるようになります。

ASP.NET の経験があれば、以下のイメージがわかりやすいと思われます。(あくまでイメージ)

Zend Framework_redirect_forward
ASP.NETResponse.RedirectServer.Transfer
参考
スポンサーリンク


Pocket

Leave a Comment

Your email address will not be published. Required fields are marked *