重複の可能性:
Zend フレームワークでのリダイレクトと転送の違いは何ですか?
私は、コントローラーでフォワード、リダイレクト、setViewRender を使用しようとすると、zend フレームワークを初めて使用しますが、それらの違いは何ですか?
重複の可能性:
Zend フレームワークでのリダイレクトと転送の違いは何ですか?
私は、コントローラーでフォワード、リダイレクト、setViewRender を使用しようとすると、zend フレームワークを初めて使用しますが、それらの違いは何ですか?
公式ドキュメントが言うように:
_forward($action, $controller = null, $module = null, array $params = null):
別のアクションを実行します。preDispatch() で呼び出された場合、現在要求されているアクションはスキップされ、新しいアクションが優先されます。それ以外の場合、現在のアクションが処理された後、_forward() で要求されたアクションが実行されます。_redirect($url, array $options = array()):
別の場所にリダイレクトします。このメソッドは、URL とオプションのオプション セットを受け取ります。デフォルトでは、HTTP 302 リダイレクトを実行します。それをよりよく理解するためにもっと読んでください。
_forward
内部リダイレクトです。クライアントのブラウザに他のURLに移動するように指示するヘッダーを_redirect
送信するのに対し、_forwardは、リクエストを別の場所に内部的にリダイレクトするようにディスパッチャに指示します。
次の通常の発送順序を検討する場合:
preDispatch()
someAction()
anotherAction()
postDispatch()
_forward
その進行の任意の時点で呼び出すと、次の手順が実行されなくなります。したがって、を呼び出す_forward
とpreDispatch()
、は呼び出されsomeAction()
ません。_forward()
ビューをレンダリングするためにviewRendererアクションヘルパーを使用している場合someAction()
(フレームワークにレンダリングするビュースクリプトを選択させる)、ビュースクリプトはレンダリングされませんsomeAction()
。
リクエストが新しいコントローラー/モジュールに転送されると、ディスパッチプロセス全体がそこで繰り返されます。
ノート:
あなたが内部someAction()
に転送するanotherAction()
場合は、このようにする必要があります
return $this->_forward('another');
を追加する必要がありreturn
ます。そう$this->_forward()
しないと、他のアクションに転送する前に、現在のアクションが引き続き実行されます。
また、レンダリングされるビューは次のようになることに注意してくださいanother.phtml
リダイレクトを実行している間、ZFはブラウザにhttp://example.com/controller-name/action-nameをロードしてヘッダーを_redirect()
送信するように指示します。つまり、新しいHTTPリクエストを作成し、それを使用してディスパッチプロセス全体を実行します。
最後に、アクション内の特定のビューをレンダリングするには、viewRenderer
アクションヘルパーを使用します。
// Bar controller class, foo module:
class Foo_BarController extends Zend_Controller_Action
{
public function addAction()
{
// Render 'bar/form.phtml' instead of 'bar/add.phtml'
$this->_helper->viewRenderer('form');
}
public function editAction()
{
// Render 'bar/form.phtml' instead of 'bar/edit.phtml'
$this->_helper->viewRenderer->setScriptAction('form');
}
public function processAction()
{
// do some validation...
if (!$valid) {
// Render 'bar/form.phtml' instead of 'bar/process.phtml'
$this->_helper->viewRenderer->setRender('form');
return;
}
// otherwise continue processing...
}
}
_redirect は完全に新しい http 要求を作成しますが、_forward は単純に要求を転送します。zend_registry で変数を設定するときにこれに気付きました。これは少し軌道から外れているように聞こえるかもしれませんが、_request を使用すると、すべての要求変数とヘッダーとレジストリ変数が完全にリセットされます。これは、_forward の場合に、以前に情報を提供したり、さらに情報を提供したりできるようなものです。
setViewRenderer については、私はこのアイデアが本当に気に入っています。つまり、これは依存性注入のようなものです。デフォルトのビューを実際に持つ必要はありません。特定のアクションに新しいビューを提供できます。これを調べていただければベストな回答が得られると思います。
リダイレクトによって特定のページ/コントローラーにリダイレクトされると確信しているため、ページを表示できるかどうかを含むすべてのプレビュープロセスを通過すると、setViewRenderは選択したビューを出力するだけで、コントローラーのすべてのものを無視しますなどのハンドル。(しかし、私はしばらくの間 zend を使用していません)