2009-08-24 3 views
1

Ich habe unterschiedliche Logik in einer Aktion hängt davon ab, ob die Anfrage ein AJAX ist oder nicht.
(Für AJAX-Logins muss ich nach erfolgreicher Anmeldung nicht umleiten, was beispielsweise bei der normalen Anmeldung nicht der Fall ist).
Was ist der beste Weg, neben der Überprüfung der Header für X-Requested-With: XMLHttpRequest
Gibt es eine Flagge oder etwas?Was ist der beste Weg, in einem Controller zu wissen, ob die Anfrage eine XMLHTTP ist oder nicht (ZF)

Antwort

6

This method Werke für eine Header-Kontrolle, die von nahezu eingestellt ist (wenn nicht) alle großen Bibliotheken JS, wie jQuery und YUI.

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

Verfahren detailliert durch smack0007 ist garantiert genau zu sein, aber die oben beschriebene Methode ist in Ordnung, wenn die Verbindung immer durch eine Bibliothek hergestellt, die den Header setzt. Es ist wahrscheinlich nicht für eine öffentliche API geeignet.

+0

Ah, kaum geschlagen mich dazu. Plus eine Verbesserung für eine gute Erklärung (plus Vorbehalte) –

+0

Dies * ist * "Überprüfung der Header für X-Requested-Mit: XMLHttpRequest", obwohl. – bobince

+0

Richtig, aber wenn Sie ein Javascript-Framework verwenden, das diese Header zuverlässig setzt (und nur diese JS-Bibliothek für Ajax-Aufrufe), dann sollten Sie sich auf die Methode verlassen können. Die Zend-Dokumentation spezifiziert zum Beispiel diese Methode "Sollte mit Prototype/Script.aculo.us arbeiten, möglicherweise anderen." Ein paar Tests mit Ihrem Framework der Wahl sollten ausreichen. Wenn jedoch ein benutzerdefiniertes JS/Ajax verwendet wird, stimme ich zu, dass bei dieser Methode möglicherweise Probleme auftreten. –

1

Normalerweise erstelle ich zwei Einstiegspunkte für meine App: /index.php und /ajax/index.php. Beide haben einen gemeinsamen Bootstrapper, aber in der ajax.php habe ich einen FrontController-Parameter gesetzt, um zu sagen, dass diese Anfrage eine Ajax-Anfrage ist.

Ich kann dann nur mit dem Request-Objekt einchecken.

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

Die Klasse Zend_Controller_Request_Http hat eine Methode namens isXmlHttpRequest(), die Ihnen sagen soll, ob die Anfrage von Javascript (ajax) stammt oder nicht.

(aus der Praxis Codierung aber) Wahrscheinlich so etwas wie dies in Ihrer Aktion wäre:

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

Es gibt keine zuverlässige Methode, um sie auseinander zu halten; Browser verwenden fast denselben HTTP-Code für XMLHttpRequest und normalen Zugriff.

Mit der verschiedenen Browser-Handhabung von benutzerdefinierten Headern und potenziellen Proxy-Interferenz, würde ich nicht vertrauen, dass die X-Requested-With-Header in allen Fällen durchkommen. (Und das ist alles, was isXmlHttpRequest eigentlich sucht.)

Stattdessen würde ich einen Parameter (? Ajax = 1) oder eine andere Methode verwenden, die eine eindeutige URL wie den Vorschlag von Smack generiert.

Verwandte Themen