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 :

Variables de session


Sujet :

Symfony PHP

  1. #1
    Membre du Club
    Homme Profil pro
    Inscrit en
    Mai 2013
    Messages
    181
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2013
    Messages : 181
    Points : 47
    Points
    47
    Par défaut Variables de session
    Bonsoir, j'ai beau lire les différents tuto présent sur le net mais je n'arrive pas à résoudre mon problème.
    J'ai un formulaire de connexion géré par FosUserBundle. Je souhaite récupéré dans un controller situé plus loin dans l'arborescence de se site, le nom d'une personne que je récupère dans une bdd suivant le login tapé.
    En ce qui concerne le coté SQL de la chose, aucun souci. Le souci interviens quand je souhaite récupéré cet variable de session et l'affiché dans ma vue.

    Voilà le code que j'ai placé dans loginController :
    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
    public function loginAction()
        {
     
            $session = new Session ();
            $session->start();
            $request = Request::createFromGlobals();
            $login = $request->request->get('_username');
            \mysql_connect('localhost', 'root','') or die('Erreur de connexion SQL');
            \mysql_select_db('test') or die('Erreur de connexion à la bdd');
            $req = mysql_query("SELECT nom FROM user WHERE username = '$login'");
    	$rep = mysql_fetch_assoc ($req);
            $session->set('nom', $rep['nom']);
            // get the login error if there is one
            if ($this->container->get('request')->attributes->has(SecurityContext::AUTHENTICATION_ERROR)) {
                $error = $this->container->get('request')->attributes->get(SecurityContext::AUTHENTICATION_ERROR);
            } else {
                $error = $this->container->get('request')->getSession()->get(SecurityContext::AUTHENTICATION_ERROR);
            }
     
            return $this->container->get('templating')->renderResponse('FormLoginBundle:Login:login.html.twig', array(
                // last username entered by the user
                'last_username' => $this->container->get('request')->getSession()->get(SecurityContext::LAST_USERNAME),
                'error'         => $error,
            ));
        }
    Et voilà à quoi correspond le bout de code à l'intérieur mon controller pour récupérer puis passer la variable dans ma vue :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $request = $this->getRequest();
            $session = $request->getSession();
            $nom = $session->get('nom');
    Le souci c'est qu'il ne s'affiche rien dans ma vue :/

  2. #2
    Membre éprouvé

    Profil pro
    Inscrit en
    Juin 2007
    Messages
    748
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 748
    Points : 1 022
    Points
    1 022
    Par défaut
    sans vouloir être pessimiste

    as tu essayé :

    et connais tu les variables prédéfinies en php?
    Conception / Dev

  3. #3
    Membre du Club
    Homme Profil pro
    Inscrit en
    Mai 2013
    Messages
    181
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2013
    Messages : 181
    Points : 47
    Points
    47
    Par défaut
    Je viens de tester le print_r($_SESSION) et il me répond :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Array ( [_sf2_attributes] => Array ( [_csrf/authenticate] => LSoomnYwowzoGNO7hOZe6JQfGjCIpxuG3BnarS1kekk [_security_main] => C:74:"Symfony\Component\Security\Core\Authentication\Token\UsernamePasswordToken":473:{a:3:{i:0;N;i:1;s:4:"main";i:2;s:433:"a:4:{i:0;C:30:"Orange\TestBundle\Entity\User":223:{a:9:{i:0;s:88:"a6ULkNJj7sYAzQtkaPhNbww7riIrvxe3dGd57DCiqcg4e+1h5zDZscoi2BD6VMfykoDpHeMpci0LG963o8ee+w==";i:1;s:31:"opxhkd3waggsws4cgoc48g4gww4o88g";i:2;s:6:"hannibal";i:3;s:6:"Hannibal";i:4;b:0;i:5;b:0;i:6;b:0;i:7;b:1;i:8;i:1;}}i:1;b:1;i:2;a:1:{i:0;O:41:"Symfony\Component\Security\Core\Role\Role":1:{s:47:"Symfony\Component\Security\Core\Role\Rolerole";s:9:"ROLE_USER";}}i:3;a:0:{}}";}} ) [_sf2_flashes] => Array ( ) [_sf2_meta] => Array ( [u] => 1400282728 [c] => 1400278329 [l] => 0 ) )
    je ne vois pas le nom récupéré par ma requête dans ce print_r.

  4. #4
    Membre éprouvé

    Profil pro
    Inscrit en
    Juin 2007
    Messages
    748
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 748
    Points : 1 022
    Points
    1 022
    Par défaut
    sachant tout cela, tu peu surement trouver plus simplement d’où vient ce problème de session
    Conception / Dev

  5. #5
    Membre du Club
    Homme Profil pro
    Inscrit en
    Mai 2013
    Messages
    181
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2013
    Messages : 181
    Points : 47
    Points
    47
    Par défaut
    Je ne comprends toujours pas pourquoi la variable nom n'existe pas dans $_SESSION. Je pense que cela viens de mon $session->set('nom') mais je ne comprends pas. Peux-tu m'expliquer pourquoi ?

  6. #6
    Membre éprouvé

    Profil pro
    Inscrit en
    Juin 2007
    Messages
    748
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 748
    Points : 1 022
    Points
    1 022
    Par défaut
    je ne connais pas spécialement le "framework" que tu utilises. Peu être que la session est en cookies ou ailleurs ?
    Conception / Dev

  7. #7
    Membre du Club
    Homme Profil pro
    Inscrit en
    Mai 2013
    Messages
    181
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2013
    Messages : 181
    Points : 47
    Points
    47
    Par défaut
    Je n'ai pas trouvé d'informations à ce sujet sur la documentation.
    L'accès à la session se fait pourtant bien comme je l'ai faite.
    Je me demande si le fait d'avoir créé ma session dans un controller puis de vouloir la récupérer dans un autre controller ne provoquerait pas cette erreur ?

  8. #8
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Septembre 2009
    Messages
    875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Septembre 2009
    Messages : 875
    Points : 1 313
    Points
    1 313
    Par défaut
    Passe par le service de session:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $session = $this->get('session');
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    public function loginAction($request)
        {
            $session = $this->get('session');
            $login = $request->request->get('_username');
            /* [...] */
            $session->set('nom', $rep['nom']);
    C'est HS, mais pourquoi tu n'utilises pas l'entity manager au lieu de faire ton traitement bdd a la main ?
    Enfin, aucun intérêt d'utiliser un framework si tu ne respectes pas la découpe en couche et les outils qu'il te met à disposition ^^'.

  9. #9
    Membre expert
    Avatar de Spartacusply
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2011
    Messages
    1 723
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2011
    Messages : 1 723
    Points : 3 274
    Points
    3 274
    Par défaut
    Je suis pas spécialiste symfony2 mais d'après mes connaissances ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     \mysql_connect('localhost', 'root','') or die('Erreur de connexion SQL');
    \mysql_select_db('test') or die('Erreur de connexion à la bdd');
    C'est vraiment pas la bonne façon de faire.

    Symfony2 est un gros framework, qui permet de faire plein de chose, mais assez complexe à prendre en main. S'y attaquer en ne possédant que peu de base de Php me semble être un pari assez risqué.

    Un premier développement "from scratch" (à partir d'une feuille blanche) pour commencer et avec un bon tuto pour débutant est une bonne idée afin d'acquérir tous les mécanismes de compréhension du langage Php.
    Un message utile vous a aidé ? N'oubliez pas le

    www.simplifions.fr - Simplifier vos comptes entre amis !

  10. #10
    Membre du Club
    Homme Profil pro
    Inscrit en
    Mai 2013
    Messages
    181
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2013
    Messages : 181
    Points : 47
    Points
    47
    Par défaut
    Spartacusply je suis désolé mais cet syntaxe est tout à fait viable sur symfony2. Il est vrai qu'il aurait peut-être été plus logique d'utiliser doctrine mais le cahier des charges m'imposer la connexion et les requêtes en mysql.

    J'ai placé ce code dans loginAction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    $session = new Session ();
            $session->start();
            $request = Request::createFromGlobals();
            $login = $request->request->get('_username');
            \mysql_connect('localhost', 'root','') or die('Erreur de connexion SQL');
            \mysql_select_db('test') or die('Erreur de connexion à la bdd');
            $req = mysql_query("SELECT nom FROM user WHERE username = '$login'");
    	$rep = mysql_fetch_assoc ($req);
            $session->set('nom', $rep['nom']);
    Par la suite j'ai ce code dans un autre controller :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $session = $this->get('session');
            $nom = $session->get('nom');
    J'ai bien évidemment placé un use Symfony\Component\HttpFoundation\Session\Session; en haut de ces 2 controller.
    Malheureusement, lorsque je passe à la vue, je n'ai aucun nom dans $nom.

  11. #11
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Septembre 2009
    Messages
    875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Septembre 2009
    Messages : 875
    Points : 1 313
    Points
    1 313
    Par défaut
    Lis mon message plus haut et remplace ta gestion de session dans login action par ca:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    public function loginAction($request)
        {
            $session = $this->get('session');
            $login = $request->request->get('_username');
            /* [...] */
            $session->set('nom', $rep['nom']);
    Il n'y'a aucune raison que tu créer une nouvelle session dans un controller, puisque la session d'un utilisateur est créé dès sa connection. Il ne faut qu'éditer la session tout le long de ton application.


    Doctrine te permet de faire des requestes mysql, c'est juste qu'il map les entités. Si tu ne veux pas utiliser doctrine, utilises au moins DBAL_connection:
    il te permet de faire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $query = "SELECT * FROM MACHIN"
    $this->connection->query($query);
    C'est plus propre que de faire toi meme les connections a la bdd...

  12. #12
    Membre expérimenté Avatar de Nico_F
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2011
    Messages
    728
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Avril 2011
    Messages : 728
    Points : 1 310
    Points
    1 310
    Par défaut
    Quand bien même tu devrais utiliser des requêtes natives, il y a des services qui les gèrent.
    Si tu utilises un framework, essaye d'utiliser les outils qu'ils te proposent.

    Spartacusply je suis désolé mais cet syntaxe est tout à fait viable sur symfony2
    Non elle ne l'est pas : je vais être radical dans mes propos : ça ne sert à rien d'utiliser un des frameworks PHP les plus aboutis aujourd'hui si c'est pour coder comme en 1999.
    Le code que tu nous montres regroupe à peu près tout ce qu'il ne faut pas faire dans le code, et ce depuis 15 ans.

    On t'impose des requêtes natives en SQL, pas de coder n'importe comment.
    Du SQL dans un contrôleur non ce n'est pas "tout à fait viable sur symfony2".
    Créer un objet Session vierge au milieu du contrôleur au lieu de récupérer celui qui contient les bonnes infos, non ce n'est pas "tout à fait viable sur symfony2".
    C'est faire tout l'inverse de la philosophie de séparation des couches. Les repositories (de Symfony) possèdent des méthodes pour faire des requêtes natives, et les mapper à des objets ensuite. Tu peux même utiliser le service de connexion à la BDD qui remplace les ouvertures et fermetures d'accès à la base n'importe comment dans le contrôleur.

    Écoute ce que te disent Spartacusply et gototog (qui a lui, de l'expérience sur SF2) : et lis un peu plus la doc : ça te permettra de t'imprégner de la manière de faire Symfony.

    Pour ton problème initial : la partie login du FOSUserBundle doit être documentée donc tu peux l'implémenter. Pour récupérer une info sur le user connecté, je pense qu'il ne doit pas y avoir beaucoup plus à faire que quelque chose de ce genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $this->container->get('security.context')->getToken()->getUser()->getName();
    Il y a rarement plus à faire quand on utilise correctement les services du framework.

    ++

  13. #13
    Membre expert
    Avatar de Spartacusply
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2011
    Messages
    1 723
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2011
    Messages : 1 723
    Points : 3 274
    Points
    3 274
    Par défaut
    Spartacusply je suis désolé mais cet syntaxe est tout à fait viable sur symfony2.
    Evidemment qu'elle est "viable" (je suppose que tu entends par là "qu'elle marche" parce que pour le reste...), parce que c'est du Php donc tout ce qui est valable en Php le reste aussi en utilisant Symfony.

    Ne pas utiliser l'ORM complète de proposé par Doctrine je peux tout à fait le comprendre, mais faire un "mysql_connect" brut dans un contrôleur c'est hard quand même (si tu fait 15 mysql_connect dans 15 fonctions différentes puis que par la suite tu changes ton mot de passe, ou tu passes tout simplement en production, t'as plus qu'à te repalucher tes 15 connexions c'est ça ?), surtout que Symfony a totalement intégré ce concept et propose de n'utiliser que la couche supérierure d'abstraction de Doctrine (voir ici).
    Un message utile vous a aidé ? N'oubliez pas le

    www.simplifions.fr - Simplifier vos comptes entre amis !

Discussions similaires

  1. [C#] Tester existence d'une variable de session
    Par IDNoires dans le forum ASP.NET
    Réponses: 2
    Dernier message: 31/12/2004, 12h30
  2. Création d'une variable de session avec un ID
    Par PrinceMaster77 dans le forum ASP
    Réponses: 4
    Dernier message: 18/10/2004, 10h28
  3. Effacer les variables de session
    Par glsn dans le forum ASP
    Réponses: 2
    Dernier message: 12/12/2003, 13h42
  4. Variable de session
    Par Sadneth dans le forum ASP
    Réponses: 6
    Dernier message: 14/11/2003, 11h12
  5. variable de session
    Par divableue dans le forum ASP
    Réponses: 2
    Dernier message: 23/10/2003, 16h04

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