web-dev-qa-db-fra.com

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 demande ajax ou non.

Si oui, rien ne s'ajoute, sinon, 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?

27
Clément Andraud

C'est très facile!

Ajoutez simplement la variable $ request à votre méthode lors de son 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 demande de noyau.

58

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' %}

Donc, tous vos modèles étendant layout.html.twig peut être automatiquement supprimé de tout votre balisage standard lorsqu'il provient d'Ajax.

Source

7
Pierre de LESPINAY

Tout d'abord, notez que getRequest () est obsolète, alors récupérez la requête via un argument dans vos méthodes d'action.

Si vous ne voulez pas polluer votre classe de contrôleur avec le code supplémentaire, une solution consiste à écrire un écouteur d'événements 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 constructeur. 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 qu'il s'agit de 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.

2
tomazahlin