2009-08-24 5 views
1

J'ai une logique différente dans une action dépend si la requête est une AJAX ou non.
(Pour les connexions AJAX, je n'ai pas besoin de rediriger après une connexion réussie, ce qui n'est pas le cas lors d'une connexion normale, par exemple).
Quel est le meilleur moyen, à côté de vérifier les en-têtes pour X-Requested-With: XMLHttpRequest
Y at-il un drapeau ou quelque chose?Quelle est la meilleure façon, à l'intérieur d'un contrôleur, de savoir si la requête est une XMLHTTP ou non (ZF)

Répondre

6

This method fonctionne en vérifiant pour un en-tête est fixée par presque (sinon) toutes les grandes bibliothèques JS, y compris jQuery et YUI.

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

La méthode détaillée par smack0007 est garantie pour être précis, mais la méthode ci-dessus est très bien si la connexion est toujours faite par une bibliothèque qui définit l'en-tête. Il ne convient probablement pas à une API publique.

+0

Ah, à peine me battre. Plus un upvote pour une bonne explication (plus des mises en garde) –

+0

Ceci * est * "vérifiant les en-têtes pour X-Requested-With: XMLHttpRequest", cependant. – bobince

+0

Vrai, mais si vous utilisez un framework javascript qui définit correctement ces en-têtes (et uniquement cette bibliothèque JS pour les appels ajax), vous devriez pouvoir vous fier à la méthode. La documentation de zend spécifie, par exemple, cette méthode "Devrait fonctionner avec Prototype/Script.aculo.us, éventuellement d'autres." Un peu de test avec votre cadre de choix devrait être suffisant. Si n'importe quel JS/Ajax personnalisé est utilisé, cependant, je suis d'accord que quelqu'un peut rencontrer des problèmes avec cette méthode. –

1

Habituellement, je crée deux points d'entrée pour mon application: /index.php et /ajax/index.php. Ils partagent tous les deux un bootstrappeur commun mais dans l'ajax.php j'ai mis un paramètre FrontController pour dire que cette requête est une requête ajax.

Je peux alors simplement vérifier avec l'objet de demande.

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

La classe Zend_Controller_Request_Http possède une méthode appelée isXmlHttpRequest() qui devrait vous indiquer si la requête provient de Javascript (ajax).

(hors de la pratique de codage, mais) serait probablement quelque chose comme ça dans votre action:

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

Il n'y a pas une méthode fiable pour leur dire à part; Les navigateurs utilisent à peu près le même code HTTP pour XMLHttpRequest et l'accès normal. Avec la gestion différente des en-têtes personnalisés et l'interférence potentielle du proxy par le navigateur, je ne ferais pas confiance à l'en-tête X-Requested-With pour passer à travers dans tous les cas. Au lieu de cela, j'utiliserais un paramètre (? Ajax = 1) ou une autre méthode qui génère une URL unique telle que la suggestion de smack.

Questions connexes