web-dev-qa-db-fra.com

Est-il possible de restreindre un itinéraire pour AJAX uniquement?

Est-il possible de restreindre un itinéraire Symfony 2 pour les requêtes XHR uniquement? Je veux déclarer des itinéraires, qui ne sont accessibles que via AJAX.

Je ne veux pas mettre de lignes supplémentaires dans chaque action spécifique à AJAX comme ça:

if ($request->isXmlHttpRequest()) {
    // do something
} else {
    // do something else
}

Je veux définir:

  • une règle pour les demandes AJAX
  • une règle pour les requêtes GET/POST vers la même URL

afin de se déplacer ayant des conditions comme ci-dessus.

48
Chris

Je sais que cette question est un peu plus ancienne mais en attendant une nouvelle façon pour y parvenir a été introduite dans Symfony 2.4 .

Correspondance d'itinéraire entièrement personnalisée avec conditions

Pour une restriction ajax, cela ressemblerait à ceci:

contact:
    path:     /contact
    defaults: { _controller: AcmeDemoBundle:Main:contact }
    condition: "request.isXmlHttpRequest()"

Également possible en annotation:

/**
 * ContactAction
 *
 * @Route("/contact", name="contact", condition="request.isXmlHttpRequest()")
 */
90
Markus Kottländer

Mon conseil serait de définir votre propre service de routeur au lieu de par défaut , qui s'étendrait de Symfony\Bundle\FrameworkBundle\Routing\Router, et redéfinissez la méthode resolverParameters () avec l'implémentation de votre propre logique pour gérer les exigences supplémentaires.

Et puis, vous pouvez faire quelque chose comme ça dans votre routage:

your_route:
    pattern:  /somepattern
    defaults: { somedefaults }
    requirements:
        _request_type:  some_requirement
10
Vitalii Zurian

Je ne suis pas sûr que vous puissiez empêcher la demande d'avoir lieu, mais vous pouvez vérifier une demande XHR dans le contrôleur en vérifiant la demande actuelle

Le code ressemblerait à ceci:

if ($request->isXmlHttpRequest()) {
    // ...
}

Ce n'est pas fiable à 100%, en raison, entre autres, des incohérences du navigateur et de la possibilité d'interférence du proxy. Cependant, c'est la méthode prédominante de vérification d'une demande asynchrone et elle est recommandée par beaucoup. Si vous êtes cr

Paramètre URL

Une alternative serait d'ajouter un paramètre dans votre URL pour identifier la demande comme asynchrone. Ceci est réalisé en ajoutant ?ajax=1 à votre URL. Ensuite, vérifiez le paramètre avec:

$AjaxRequest = $request->getParameter('ajax');
If($AjaxRequest == 1) {
    //...
}

Bien sûr, à ce stade, vous pouvez également créer un itinéraire spécifique, par exemple /ajax/index/.

3
Rich

Non vous ne pouvez pas. Cela ne dépend pas du framework que vous utilisez, AJAX les requêtes ne sont en fait que des requêtes vers un serveur. Il n'y a pas de solution 100% fiable, juste des "hacks".

2
dmirkitanov

Ce que vous recherchez n'existe pas dans la configuration de routage Symfony.

Request :: isXmlHttpRequest n'est même pas fiable à 100% et vérifie les en-têtes HTTP mis par votre bibliothèque JavaScript:

Cela fonctionne si votre bibliothèque JavaScript a défini un en-tête HTTP X-Requested-With. Il est connu pour fonctionner avec Prototype, Mootools, jQuery.

1
AlterPHP

Vous pouvez utiliser exigences pour atteindre le résultat décrit.
Donc, supposons que vous définissez des itinéraires au format yml, vous devez faire quelque chose comme ceci

my_route:
  pattern:  /path/to/route
  defaults: { _controller: CompanyBundle:Controller:Action, _format: html }
  requirements:
      _format:  xmlhttp /* not sure about the correct format because
                           i've never checked about */

Et vous pouvez bien sûr utiliser _method: POST ou _method: GET

0
DonCallisto