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.NET | Response.Redirect | Server.Transfer |