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 :

Event sur kernel.request [2.x]


Sujet :

Symfony PHP

  1. #1
    Membre habitué
    Profil pro
    Développeur Web
    Inscrit en
    Avril 2010
    Messages
    141
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Avril 2010
    Messages : 141
    Points : 157
    Points
    157
    Par défaut Event sur kernel.request
    Bonjour,

    j'ai un petite problématique certainement très simple à résoudre mais ne m'étant jamais encore attaqué à cela sous S2, je ne sais pas encore comment le faire.

    Je souhaiterai rediriger l'utilisateur, une fois loggé, sur une page de choix de poste si la valeur du poste n'est pas encore présente en session. Seulement j'imagine qu'il ne suffit pas de mettre un event listener sur le login car si la valeur n'est pas présente après cela et que l'utilisateur est loggé, cela faussera quasiment toutes mes pages derrières.

    Est-il mieux de réaliser un service ou un Event listener pour cela? Et dans le second cas, sur quel événement le placer? Doctrine peut-être?

    Si vous avez des liens pouvant m'éclairer sur le sujet, je suis preneur.

    Merci d'avance.

  2. #2
    Membre habitué
    Profil pro
    Développeur Web
    Inscrit en
    Avril 2010
    Messages
    141
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Avril 2010
    Messages : 141
    Points : 157
    Points
    157
    Par défaut
    Bon après quelques recherches, l'event listener ne serait pas vraiment à placer sur Doctrine. Comme cela concerne la session, c'est plus de ce côté qu'il faudrait rechercher, mais j'ai du mal à trouver de l'info sur un éventuel session listener...

    Bref, j'ai besoin de lumière.

  3. #3
    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,
    tu peux utiliser l'evenement security.interactive_login

    voir ce lien par exemple
    http://www.metod.si/login-event-listener-in-symfony2/

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    public function onSecurityInteractiveLogin(Event $event)
    {
     
    //on détermine l'url de redirection
    $url="mon url";
    //création de la réponse
    $response=new RedirectResponse($url);
    //provoque la redirection
    $event->setResponse($response);
     
    }

  4. #4
    Membre habitué
    Profil pro
    Développeur Web
    Inscrit en
    Avril 2010
    Messages
    141
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Avril 2010
    Messages : 141
    Points : 157
    Points
    157
    Par défaut
    Bon j'ai bien avancé dessus hier, j'ai placé l'event sur le kernel.request et ai réussi à vérifier la session à partir d'ici. La redirection fonctionne...

    Sauf que problème ridicule, c'est qu'évidemment étant mis sur le kernel.request, une fois redirigé, et bien cela tourne en boucle.

    A part mettre un flag ou autre, je ne sais pas si il existe une solution plus propre. Où alors peut-être que je ne m'y prends pas du tout de la bonne façon.

    En tout cas, bien content d'avoir découvert ce système d'injection.

  5. #5
    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
    pourquoi tu l'as pas mis sur l'event security.interactive_login comme arno999 te l'as dit ? J'ai un problème similaire dans mon projet et ca marche nickel.

    Olivier

  6. #6
    Membre habitué
    Profil pro
    Développeur Web
    Inscrit en
    Avril 2010
    Messages
    141
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Avril 2010
    Messages : 141
    Points : 157
    Points
    157
    Par défaut
    Car si j'ai bien compris, cet événement est pour effectuer une action directement après le login. Or, moi c'est pour une page de choix de poste, choix obligatoire puisque toutes les pages suivantes le nécessite. Et je souhaite pouvoir changer ma valeur de poste en session par la suite sans repasser par un login.

    Je ne sais pas si cela est très clair mais mon choix me parait adéquat, non?
    Que réalises-tu avec ce listener?

    Edit : Voilà ce que j'ai réalisé pour mon problème de flag en fait

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    if (!($session->get('entreprise') ||
                    $urlmatcher->checkRequestPath($request, '/login') ||
                    $urlmatcher->checkRequestPath($request, '/choix-entreprise') ||
                    $urlmatcher->checkRequestPath($request, '/inscription')))
            {            
                $event->setResponse(new RedirectResponse($this->router->generate('choix_entreprise')));
            }
    Pas sûr que cela soit très propre, très maintenable ou très performant (bien que négligeable) mais comme ces URL sont à priori les seules concernées...

    Par contre je vais devoir rouvrir un nouveau topic, je suis tombé sur une nouvelle énigme... l'affichage de cette ligne dans mon if, même si elle n'est pas exécutée, m'empêche d'avoir accès à la barre de debug.

  7. #7
    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
    Pour moi si ! ça résout ton problème si tu rempli ta session juste après que la personne se soit logguée, tous tes utilisateurs auront la données en session.

    Moi je viens stocker des données en session pour m'éviter d'aller les chercher par la suite lorsque j'exécute des requêtes (ca m'évite des jointures)

  8. #8
    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
    Par rapport à ton besoin je pense qu'il serait préférable que tu ais un service pour accéder à tes variables de session et faire éventuellement une redirection

    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
     
     
    //une instance de cette classe est enregistré dans le container
    // de plus elle est taggé pour être un listener sur l'evenement on Exception
    class EntrepriseProvider{
     
    	protected $session;
     
    	protected $isCompleted;
     
    	protected $router;
     
    	public function _construct($session,$router){
    		$this->session=$session;
    		$this->router=$router;
    		$this->isCompleted=true;
    	}
     
    	public function getEntreprise(){
    		$e=$this->session->get('entreprise');
    		if(!$e){
    			$this->isCompleted=false;
    			throw new \Exception("les variables en session ne sont pas remplies");	
    		}
    		return $e;
     
    	}
     
    	public function onException(Event $e){
    		if($this->isCompleted){
    			return;	
    		}
    		//on considère que l'Exception a été lancée lorsque l'on a tenté d'accéder à une valeur non rempli
    		// donc on redirige vers le formulaire permettant de remplir ces valeurs
    		$url=$this->router->generate('alimente_entreprise');
    		$response= new RedirectResponse($url);
    		$event->setResponse($response);
    	}
     
    }
    dans les controllers

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    public function indexAction(){
     
    	//si la valeur n'est pas rempli, l'action du controlleur est interrompu (car Exception) l'application renvoit sur le dispatcher et les listeners de l'evenement on Exception
    	$poste1=$this->get('entreprise.provider')->getEntreprise();
    //...
     
    }
    On peut évidemment factoriser ce code de façon plus propre avec une classe Exception personalisée et un service listener séparé

  9. #9
    Membre habitué
    Profil pro
    Développeur Web
    Inscrit en
    Avril 2010
    Messages
    141
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Avril 2010
    Messages : 141
    Points : 157
    Points
    157
    Par défaut
    C'est très certainement la meilleure idée, puisque j'aurais posé la question par la suite concernant la récupération de ces valeurs de session dans un formHandler.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Driver nvidia freeze sur kernel 2.6.16 sous Fedora core 5
    Par Invité4 dans le forum Matériel
    Réponses: 1
    Dernier message: 03/04/2006, 10h54
  2. Event sur base de donnée Firebird et programmation delphi
    Par seb8810 dans le forum Connexion aux bases de données
    Réponses: 5
    Dernier message: 16/03/2006, 17h06
  3. Event sur le parcours d'un combobox
    Par Psykotik dans le forum MFC
    Réponses: 11
    Dernier message: 25/11/2005, 09h20
  4. Emuler windows xp (ou os basé sur kernel nt) ?
    Par Michaël dans le forum Autres Logiciels
    Réponses: 4
    Dernier message: 19/11/2005, 12h25
  5. window.event sur netscape
    Par edon47 dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 24/10/2005, 02h57

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