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:
afin de se déplacer ayant des conditions comme ci-dessus.
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()")
*/
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
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/
.
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".
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.
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