Symfony2, vérifiez si une action est appelée par ajax ou non
J'ai besoin, pour chaque action dans mon contrôleur, de vérifier si ces actions sont appelées par une requête ajax ou pas.
Si oui, rien ajouter, si non, je dois rediriger vers la page d'accueil.
Je viens de trouver if($this->getRequest()->isXmlHttpRequest())
, mais je dois ajouter cette vérification à chaque action..
Connaissez-vous une meilleure façon ?
3 réponses
C'est très facile!
Ajoutez simplement la variable $ request à votre méthode en tant qu'utilisation. (Pour chaque contrôleur)
<?php
namespace YOUR\Bundle\Namespace
use Symfony\Component\HttpFoundation\Request;
class SliderController extends Controller
{
public function someAction(Request $request)
{
if($request->isXmlHttpRequest()) {
// Do something...
} else {
return $this->redirect($this->generateUrl('your_route'));
}
}
}
Si vous voulez le faire automatiquement, vous devez définir un écouteur de requête du noyau.
Pour une technique réutilisable, j'utilise ce qui suit à partir du modèle de base
{# app/Resources/views/layout.html.twig #}
{% extends app.request.xmlHttpRequest
? '::ajax-layout.html.twig'
: '::full-layout.html.twig' %}
Ainsi, tous vos modèles s'étendant layout.html.twig
peuvent être automatiquement supprimés de tout votre balisage standard lorsqu'ils proviennent D'Ajax.
Tout d'abord, notez que getRequest() est obsolète, donc obtenez la requête via un argument dans vos méthodes d'action.
Si vous ne voulez pas polir votre classe de contrôleur avec le code supplémentaire, une solution consiste à écrire un écouteur d'événement qui est un service.
, Vous pouvez le définir comme ceci:
services:
acme.request.listener:
class: Acme\Bundle\NewBundle\EventListener\RequestListener
arguments: [@request_stack]
tags:
- { name: kernel.event_listener, event: kernel.request, method: onRequestAction }
Ensuite, dans la classe RequestListener, créez une méthode onRequestAction () et injectez la pile de requêtes via le constrcutor. Dans onRequestAction (), vous pouvez obtenir le nom du contrôleur comme ceci:
$this->requestStack->getCurrentRequest()->get('_controller');
Il renverra le nom et l'action du contrôleur (je pense qu'ils sont séparés par:). Analysez la chaîne et vérifiez si c'est le bon contrôleur. Et si c'est le cas, vérifiez également que C'est XmlHttpRequest comme ceci:
$this->requestStack->getCurrentRequest()->isXmlHttpRequest();
Si ce n'est pas le cas, vous pouvez rediriger/transférer.
Notez également que cela sera vérifié à chaque demande. Si vous vérifiez ces choses directement dans l'un de vos contrôleurs, vous aurez une solution plus légère.