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 ?

24
demandé sur Clément Andraud 2014-05-28 16:45:09

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.

55
répondu R. Canser Yanbakan 2014-05-28 13:38:33

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.

Source

5
répondu Pierre de LESPINAY 2016-04-26 08:09:37

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.

2
répondu tomazahlin 2014-05-28 13:32:49