新しいページ(別のアプリケーション、コントローラー、アクション)にリダイレクトし、現在のPOSTデータを維持する方法を見つけようとしています。
私のアプリはPOSTデータを検証しており、特定の基準が満たされた場合、別の場所にリダイレクトしたいのですが、POSTデータがPOSTデータとしてその新しい場所に渡されることを確認してくださいページ。大まかな例を次に示します。
_POST /app1/example HTTP/1.1
Host: example.com
Content-Type: application/x-www-form-urlencoded
Content-Length: 17
var1=foo&var2=bar
_
exampleAction
(Zend_Controller_Action)で、_var1 == foo
_かどうかを確認し、リダイレクトする場合は(302)同じPOSTデータを使用して/ app2/exampleにリダイレクトします。たぶんこのようなもの?
_HTTP/1.x 302 Found
Location: /app2/example
Content-Type: application/x-www-form-urlencoded
Content-Length: 17
var1=foo&var2=bar
_
Zend_Http_Clientを使用して新しいHTTPリクエストを作成する方法はわかりますが、単にページをリクエストしてコンテンツを表示することは考えていません。とにかくZend_Http_Clientの使用を引き続き検討する必要がありますか?現時点では、次のようなもので遊んでいます。
_$this->getResponse()->setRedirect('/app2/example/', 302);
$this->getResponse()->setBody(http_build_query($this->_request->getPost()));
_
私がやりたいことは、なんらかの策略と悪魔の呪いによって可能になると確信していますが、それは間違いなく私をほのめかしています。どんな助けでも大歓迎です。
-rk
ブラウザを新しい場所にリダイレクトするのではなく、コントローラから他のコントローラにリクエストを転送してみませんか?
return $this->_forward("action", "controller", "module");
IMOでは、POSTでリダイレクトを行うことはできません。 http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10. を参照してください。
すでに述べたように、POSTデータをセッションに保存できます。
Controller_requestオブジェクトを使用できます
$this->_request->setPost(array(
'someKey' => 'someValue'
));
そして、単に_forwardprotectedメソッドを使用します
$this->_forward('yourAction', 'yourController', 'yourModule');
次に、転送されたコントローラーアクションで、
$aPost = $this->_request->getPost();
リダイレクタアクションヘルパーを使用できます。
これは私のために働いています。あるログイン画面から別のログイン画面にログイン資格情報を渡します。 307により、ブラウザはリダイレクトが発生していることをユーザーに警告する場合があります。303はリダイレクトして次のページに資格情報を入力しますが、2番目のフォームは送信しません。
$baseUrl = 'https://example.com';
$this->_redirector = $this->_helper->getHelper('Redirector');
$this->_redirector->setCode(307)
->setUseAbsoluteUri(true)
->gotoUrl($baseUrl . '/home/login',
array('username' => $authForm->getValue('username'),
'password' => $authForm->getValue('password')
)
);
クライアントはサーバーの応答後にリダイレクトを処理するため、これについてはあまりできないと思います。たとえばFirefoxは、ユーザーにPOSTデータを新しい場所に再送信するかどうかを尋ねます。
厄介な解決策は、HTMLフォームに入力して返送し、JavaScriptで自動送信することです。 :/
私は特にZendに精通していませんが、あなたの問題に対して私が取る2つのアプローチがあります。