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 |