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.
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()")
*/
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
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/
.
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".
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.
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