Zendフレームワークのリダイレクトとフォワードの違いは何ですか?
いつリダイレクトを使用し、いつフォワードを使用すればよいですか?
_forward()
だけforwardsすべてを別のコントローラーアクションに転送する一方で、_redirect()
はヘッダーを送信するため、新しいHTTPリクエストを使用して、ディスパッチプロセス全体を実行します。
たとえば、http://example.com/foo/barを呼び出すと、foo
コントローラとbar
アクション。 bar
アクション内をbaz
アクションに転送する場合、たとえば、まったく同じリクエスト内では、ブラウザは同じURLにありますが、リダイレクトを行うとき、ZFはブラウザにhttp://example.com/ foo/baz。
基本的に、_forward()
は
_$request->setActionName($action)
->setDispatched(false);
_
_redirect()
は
_$this->_helper->redirector->gotoUrl($url, $options);
_
ページをリロードしてフォームデータを再投稿しないようにする場合は、通常、リダイレクトを行います。
これらを参照してください:
あなたがオフィスで電話を受けると想像してください。誰かが販売について話したいと思っています。 「123456に電話して」と言って電話を切った場合、これはredirectです。 「ちょっと待って」と言って通話を転送すると、これは転送になります。 ;)
URLを同じにしたい場合は_ forward()を使用します-注意、それは何を意味するのですか使用している基本コントローラクラスが2回呼び出されています。
1つのリクエストが1つのコントローラーインスタンスを呼び出すという流れを直感的に理解していることを考えると、それは明白または些細なことのように思えるかもしれませんが、心に留めないと、アプリケーション設計を本当に台無しにする可能性があります。例えば。これは、リクエストスコープのシングルトンhaveがstatic
として宣言されることを意味します。そうでない場合、_ forward()はそれらを破壊します。
リダイレクトは新しいURLで301/302をブラウザーに送り返すのに対し、転送はリクエストを内部で別のコントローラーアクションに「転送」するだけですが、URLは同じに保つため、ブラウザーは違いを認識しません。 。
1-redirectは、header()情報を使用して新しい応答を作成します[302が見つかりましたまたは301 ==永久に移動しました]。その場合、再度ディスパッチサイクルに到達します
2フォワードディスパッチプロセスに再度入ることなく、実行フローをその新しいリクエストに変更します。
リダイレクトアクションは、現在のページプロセスを終了し、別のページにリダイレクトします。ブラウザーがリダイレクトを受信すると、すべてのコンテキストが変更されます(新しいコントローラー/アクション)。新しいURLに接続します
一方、転送は同じページにとどまりますが、コンテキストは変更されません。これは関数呼び出しとして見ることができます。ビューは通常どおり読み込まれます。