2009-08-24 9 views
1

アクションに異なるロジックがあるのは、要求がAJAXであるかどうかによって異なります。
(AJAXログインの場合、ログインが成功した後はリダイレクトする必要はありません。通常のログインではそうではありません)。
ヘッダーのチェックの隣には何がありますかX-Requested-With: XMLHttpRequest
フラグなどはありますか?コントローラ内で、リクエストがXMLHTTPであるかどうかを知る最善の方法(ZF)

答えて

6

This method作品。

$this->getRequest()->isXmlHttpRequest() //returns true if is XHR 

smack0007により詳細な方法は、正確であることを保証するが、接続は常にヘッダを設定ライブラリによって作製されている場合、上記の方法は、微細です。おそらくパブリックAPIには適していません。

+0

ああ、ほとんど私にそれを打つ。さらに詳しい説明のためにアップヴォートを加えました(さらに注意点) –

+0

これは、X-Requested-Withのヘッダーをチェックしています:XMLHttpRequestです。 – bobince

+0

本当ですが、これらのヘッダーを確実に設定するJavaScriptフレームワークを使用している場合(そしてJSライブラリのJSライブラリのみ)、メソッドに頼ることができます。 zendのドキュメントでは、たとえば、このメソッドは "Prototype/Script.aculo.usで動作する必要があります。あなたの選択のフレームワークで少しテストすれば十分です。カスタムJS/Ajaxが使用されている場合でも、私は誰かがこのメソッドで問題に遭遇する可能性があることに同意します。 –

1

私は通常、私のアプリの2つのエントリーポイントを作成します:/index.phpと/ajax/index.phpです。彼らはどちらも共通のブートストラップを共有していますが、ajax.phpではこのリクエストがajaxリクエストであると言うためにFrontControllerパラメータを設定しました。

これで、Requestオブジェクトでチェックインできます。ほとんどjQueryとYUIを含む主要なJSライブラリの全て(ない場合)によって設定されているヘッダをチェックすることにより

if($this->getRequest()->getParam('ajax')) { 
    // Ajax request 
} else { 
    // Normal request 
} 
1

Zend_Controller_Request_Httpクラスには、isXmlHttpRequest()というメソッドがあり、リクエストがJavascript(ajax)からのものかどうかを示す必要があります。

(練習コーディングのうちけど)は、おそらくあなたのアクションでこのようなものになるだろう:

if($this->getRequest()->isXmlHttpRequest()){ 
    //is ajax 
} 
else{ 
    //regular request 
} 
3

それらを区別するための信頼できる方法はありません。ブラウザはXMLHttpRequestと通常のアクセスの両方でほぼ同じHTTPコードを使用します。

ブラウザがカスタムヘッダーを処理し、プロキシの干渉が発生する可能性があるため、X-Requested-Withヘッダーをすべて信頼することはできません。

代わりに、私はパラメータ(?ajax = 1)、またはsmackの提案などの一意のURLを生成する他のメソッドを使用します(これは実際に探しているisXmlHttpRequestのすべてです)。

関連する問題