Est-il possible de restreindre une route pour AJAX seulement?

est-il possible de restreindre une route 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 requêtes AJAX
  • une seule règle pour GET/POST demandes vers la même URL

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

45
demandé sur Carlos Granados 2012-07-19 13:19:02

6 réponses

je sais que cette question est un peu plus ancienne mais en attendant un nouvelles pour y parvenir a été introduit dans Symfony 2.4.

Route complètement personnalisée correspondant aux Conditions

Pour un ajax restriction, il devrait ressembler à ceci:

contact:
    path:     /contact
    defaults: { _controller: AcmeDemoBundle:Main:contact }
    condition: "request.isXmlHttpRequest()"
/**
 * ContactAction
 *
 * @Route("/contact", name="contact", condition="request.isXmlHttpRequest()")
 */
84
répondu Markus Kottländer 2015-09-03 09:03:20

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 de redéfinir la méthode resolveParameters () avec la mise en œuvre de votre propre logique pour traiter les exigences supplémentaires.

Et puis, vous pourriez faire quelque chose comme ceci dans votre routage:

your_route:
    pattern:  /somepattern
    defaults: { somedefaults }
    requirements:
        _request_type:  some_requirement
10
répondu Vitalii Zurian 2012-07-26 06:30:10

Je ne suis pas sûr que vous puissiez empêcher la requête d'avoir lieu, cependant vous pouvez vérifier une requête XHR dans le Controller en cochant la requête courante

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 par procuration. Cependant, c'est la méthode prédominante de vérification d'une requête 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 requête asynchrone. Ceci est réalisé en ajoutant ?ajax=1 à votre URL. Ensuite, vérifiez le paramètre:

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

bien sûr, à ce stade, vous pourriez aussi créer un Itinéraire spécifique, par exemple,/ajax/index/.

2
répondu Rich 2012-07-19 11:56:37

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

2
répondu dmirkitanov 2012-07-27 22:31:11

ce que vous recherchez n'existe pas en configuration de routage Symfony.

Demande: isXmlHttpRequest est même pas fiable à 100%, et vérifie les en-têtes HTTP de la mettre par votre bibliothèque JavaScript :

cela fonctionne si votre bibliothèque JavaScript définit un X-Requested-avec l'en-tête HTTP. Il est connu pour travailler avec Prototype, Mootools, jQuery.

1
répondu AlterPHP 2012-07-25 14:15:29

Vous pouvez utiliser le besoins pour atteindre le décrit résultat.

Donc, supposons que vous définissiez des routes au format yml, vous devez faire quelque chose comme ça

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
répondu DonCallisto 2012-07-23 07:22:56