web-dev-qa-db-ja.com

Zendフレームワークのリダイレクトとフォワードの違いは何ですか

Zendフレームワークのリダイレクトとフォワードの違いは何ですか?

いつリダイレクトを使用し、いつフォワードを使用すればよいですか?

38
user1400

_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);
_

ページをリロードしてフォームデータを再投稿しないようにする場合は、通常、リダイレクトを行います。

これらを参照してください:

54
Gordon

あなたがオフィスで電話を受けると想像してください。誰かが販売について話したいと思っています。 「123456に電話して」と言って電話を切った場合、これはredirectです。 「ちょっと待って」と言って通話を転送すると、これは転送になります。 ;)

68
user187291

URLを同じにしたい場合は_ forward()を使用します-注意、それは何を意味するのですか使用している基本コントローラクラスが2回呼び出されています。

1つのリクエストが1つのコントローラーインスタンスを呼び出すという流れを直感的に理解していることを考えると、それは明白または些細なことのように思えるかもしれませんが、心に留めないと、アプリケーション設計を本当に台無しにする可能性があります。例えば。これは、リクエストスコープのシングルトンhavestaticとして宣言されることを意味します。そうでない場合、_ forward()はそれらを破壊します。

4
pinkgothic

リダイレクトは新しいURLで301/302をブラウザーに送り返すのに対し、転送はリクエストを内部で別のコントローラーアクションに「転送」するだけですが、URLは同じに保つため、ブラウザーは違いを認識しません。 。

2
Andy Shellam

1-redirectは、header()情報を使用して新しい応答を作成します[302が見つかりましたまたは301 ==永久に移動しました]。その場合、再度ディスパッチサイクルに到達します

2フォワードディスパッチプロセスに再度入ることなく、実行フローをその新しいリクエストに変更します。

1
tawfekov

リダイレクトアクションは、現在のページプロセスを終了し、別のページにリダイレクトします。ブラウザーがリダイレクトを受信すると、すべてのコンテキストが変更されます(新しいコントローラー/アクション)。新しいURLに接続します

一方、転送は同じページにとどまりますが、コンテキストは変更されません。これは関数呼び出しとして見ることができます。ビューは通常どおり読み込まれます。

0
Rodolphe