IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Symfony PHP Discussion :

requéte Ajax dans symfony 2


Sujet :

Symfony PHP

  1. #1
    Candidat au Club
    Inscrit en
    Avril 2010
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 5
    Points : 4
    Points
    4
    Par défaut requéte Ajax dans symfony 2
    salut à tous ça fais des jours que je cherche des solutions à mon problème,en fait je veux modifier la fonction loginAction de symfony 2 en utilisant ajax pour retourner les erreurs d'authentification,mais le problème est que mon controller ne détecte plus isXmlHttpRequest() et je sais pas pourquoi.
    voila mon DefaultController.php:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    public function loginAction()
        {
     
            $request = $this->container->get('request');
            $isAjax = $request->isXmlHttpRequest();
    		$session = $request->getSession();
    		$error='';
      if($isAjax==true)
        {
     
     
     
            // get the login error if there is one
     
     
     
            if ($request->attributes->has(SecurityContext::AUTHENTICATION_ERROR)) {
     
                $error = $request->attributes->get(SecurityContext::AUTHENTICATION_ERROR);
     
     
            } 
    else {
                $error = $request->getSession()->get(SecurityContext::AUTHENTICATION_ERROR);
     
            }
     
    		 return $this->render('MyhomeBundle:Security:login.html.twig', array(
     
                'last_username' => $session->get(SecurityContext::LAST_USERNAME),
                'error'         => $error,));
    $response = new Response(json_encode($error));
    		return $response;
     
    		}
    		else return $this->render('MyhomeBundle:Security:login.html.twig', array(
     
                'last_username' => $session->get(SecurityContext::LAST_USERNAME),
                'error'         => $error,));
     
    }
    et voici mon code js:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    <script>
     
     
    $('#monforme').submit(function() {
     
    $.ajax({
    type : 'POST',
    url : '{{ path('login_check') }}',
    dataType : 'json',
    data: {},
    success : function(data){
     
    $('#div_login_message').html(''+data.error);
     
    }
    });
     
    return false;
    });
     
    </script>
    et voila mon routing.php
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    login:
        pattern:   /login
        defaults:  { _controller: MyhomeBundle:default:login}  
     
     
     
     
    login_check:
        pattern:   /login_check
        requirements:
          _method: POST
    Merci d'avance

  2. #2
    Membre averti

    Inscrit en
    Juin 2008
    Messages
    307
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 307
    Points : 364
    Points
    364
    Par défaut
    Message d'erreur ?

  3. #3
    Candidat au Club
    Inscrit en
    Avril 2010
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 5
    Points : 4
    Points
    4
    Par défaut
    il ya pas d'erreur mais il va directement au dernier else donc isAjax prend tjrs False.est c qu'il ya un moyen de tester prkoi mon requete ajax n'est pas reconnu?

  4. #4
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Juin 2011
    Messages
    725
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juin 2011
    Messages : 725
    Points : 1 050
    Points
    1 050
    Par défaut
    Bonjour,

    Sauf erreur de copier/coller ou bug de mon navigateur ton action va toujours renvoyer la reponse twig
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    return $this->render('MyhomeBundle:Security:login.html.twig', array( 
                'last_username' => $session->get(SecurityContext::LAST_USERNAME),
                'error'         => $error,));
    //aucune raison que la méthode ne passe par ici
    $response = new Response(json_encode($error));
    return $response;
    dans ton code javascript tu fais un appel Ajax sur la route login_check et pas sur login si une erreur d'authentification a lieu il y a une redirection de la requete sur Login, c'est une redirection HTTP donc l'objet Request est différent entre login_check et login (dans login il n'est pas considéré comme XmlHttpRequest;

    Je pense que ton problème est similaire à celui que j'avais eu il y a quelques temps et qui se règle via un listener:
    http://www.developpez.net/forums/d11...x-redirection/

  5. #5
    Candidat au Club
    Inscrit en
    Avril 2010
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 5
    Points : 4
    Points
    4
    Par défaut
    Ok je veux voir ce lien.entous cas merci pour ta réponse

  6. #6
    Candidat au Club
    Inscrit en
    Avril 2010
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 5
    Points : 4
    Points
    4
    Par défaut
    svp est ce que tu peux me donner quelques explications à propos listener et event car j'arrive pas à débuter et créer ce listener pour attraper la requête ajax. merci de nouveau

  7. #7
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Juin 2011
    Messages
    725
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juin 2011
    Messages : 725
    Points : 1 050
    Points
    1 050
    Par défaut
    Un listener c'est un service dont une méthode sera automatiquement appelé à un moment du déroulement de l'application
    tu as besoin:

    d'une classe Extension avec une méthode load dans le répertoire Dependencyinjection de ton Bundle
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    # My\Bundle\DependencyInjection\MyBundleExtension.php
    namespace My\Bundle\DependencyInjection;
    use Symfony\Component\HttpKernel\DependencyInjection\Extension;
    use Symfony\Component\DependencyInjection\ContainerBuilder;
    use Symfony\Component\DependencyInjection\Loader\XmlFileLoader;
    use Symfony\Component\Config\FileLocator;
    class MyBundleExtension{
    	public function load(array $configs, ContainerBuilder $container){
            $loader = new XmlFileLoader(
                $container,
                new FileLocator(__DIR__.'/../Resources/config')
            );
            $loader->load('services.xml');//charge la configuration pour le container
        }
    }
    d'un fichier de configuration dans Resources\Config
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    # My\Bundle\Resources\Config
    <?xml version="1.0" ?>
    <container xmlns="http://symfony.com/schema/dic/services"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://symfony.com/schema/dic/services http://symfony.com/schema/dic/services/services-1.0.xsd">
      <services>        
    	<!--le nom de la classe -->
        <service id="my.listener" class="My\Bundle\Listener\MyListener" scope="container">
          <!-- on passe un argument à notre instance le service de login, mais on pourrait lui passer tout les services que l'on veut-->
          <argument type="service" id="logger" />
          <!--les balises tags indiquent quel méthode doivent être appelé pour les évenements--> 
          <tag name="kernel.event_listener" event="security.interactive_login" method="onSecurityInteractiveLogin"/>           
          <tag name="kernel.event_listener" event="kernel.response" method="onResponse"  />     
        </service>
      </services>
    </container>
    d'une classe qui sera instancié et appelé en fonction de la configuration de services.xml
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    # My\Bundle\Listener\MyListener.php
    namespace My\Bundle\Listener;
    use Symfony\Component\Security\Http\Event\InteractiveLoginEvent;
    use Symfony\Component\HttpKernel\Event\FilterResponseEvent;
    class MyListener{
    	protected $userHasJustLog=false;
    	protected $logger;//pour afficher les logs dans la debugBar
    	public function __construct($logger){
    		$this->logger=$logger;	
    	}
    //cette méthode est appelé lorsqu'un utilisateur a réussi à se logger à l'application
    	public function onSecurityInteractiveLogin(InteractiveLoginEvent $event){
    		$this->logger->info('msg de MyListener: authentification réussi');
    		$this->userHasJustLog=true;//on garde en mémoire le fait que l'utilisateur vient juste de se logger
           }
    //cette méthode est appelé lorsqu'une réponse est renvoyé par un controller ou un listener
    //les méthodes appelé via les listener ont un argument de type Event 
    	public function onResponse(FilterResponseEvent $event){
    		$this->logger->info('msg de MyListener: on response');
    		$request=$event->getRequest();//on retrouve l'objet request le même que celui que l'on traite dans un controller
    		if(!$request->isXmlHttpRequest()){//on ne s'occupe que des requetes Ajax
    			return;
    		}
                  $this->logger->info('msg de MyListener: ceci est une requete Ajax');
    		$error = $request->attributes->get(SecurityContext::AUTHENTICATION_ERROR);
    		if($error){			
    	               $response=new Response(json_encode($error),401,array('content-type'=>'application/json');
                           $event->setResponse($response);
    			//en appelant la méthode setResponse on efface la réponse précédente qui était une redirection Http envoyé par le firewall
    		}else if($this->userHasJustLog){//si l'utilisateur vient juste de se logger
                            $response=new response('log successfull');
    			$event->setResponse($response);
    		}
    	}
    }
    Je n'ai pas testé le code,mais l'important c'est que tu retrouves tes messages de log dans la débugBar pour comprendre dans quels ordre sont exécutés les instructions

    tu as accés à ton listener dans le controller via $this->get('my.listener').
    En appelant la commande app/console container:debug ton service doit apparaitre dans la liste des services.

    pour en savoir plus:
    http://symfony.com/doc/2.0/book/internals.html#events
    http://api.symfony.com/2.0/Symfony/C...onseEvent.html

Discussions similaires

  1. [1.x] fonction $ajax dans symfony
    Par nlefebvre1 dans le forum Symfony
    Réponses: 1
    Dernier message: 21/11/2011, 12h02
  2. [1.x] Recherche et ajax dans symfony
    Par tiffany dans le forum Symfony
    Réponses: 1
    Dernier message: 22/07/2010, 17h54
  3. [AJAX] Conflits lors de deux requêtes AJAX dans la même fonction js
    Par fayred dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 15/07/2008, 14h49
  4. [AJAX] Affichage de requête PHP dans un div créé par Ajax
    Par will89 dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 13/12/2007, 19h00
  5. Réponses: 4
    Dernier message: 06/11/2007, 14h05

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo