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 :

Undefined variable: sf_user


Sujet :

Symfony PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Inscrit en
    Juillet 2006
    Messages
    747
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 747
    Par défaut Undefined variable: sf_user
    Bonjour a tous,

    Je m'essaie au tutoriel de la ferme du web concernant Symfony. Concernant l'usage des sessions, je m'y prends de la façon suivante :

    Je crée un module quizz via symfony.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    symfony generate:module frontend quizz
    J'ai donc une action Index et un template indexSuccess.php.

    Dans mon action executeIndex, je fais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $this->getUser()->setAttribute("email", "toto@exemple.com");
    et lorsque dans mon template indexSuccess.php, je fais

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    echo $sf_user->getAttribute('email') ;
    J'ai constamment ce message d'erreur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Undefined variable: sf_user
    Quelqu'un peut-il m'expliquer ce que je fais mal !?!?

    Merci

  2. #2
    Futur Membre du Club
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    5
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France, Haute Vienne (Limousin)

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5
    Par défaut
    Tu as dans ton frontend dans le dossier lib le fichier "myUser.class.php" qui étend "sfBasicSecurityUser" ?

  3. #3
    Expert confirmé
    Avatar de Michel Rotta
    Homme Profil pro
    DPO
    Inscrit en
    Septembre 2005
    Messages
    4 954
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : DPO
    Secteur : Distribution

    Informations forums :
    Inscription : Septembre 2005
    Messages : 4 954
    Par défaut
    La variable $sf_user n'existe plus dans le template. Elle a été supprimé lors du passage de la 1.0 à la 1.1 dans mes souvenir.

    Le message est donc correcte.

    L'idéal est de transmettre directement ta donnée à ton template, le stockage dans l'objet user n'a pas d'intérêt pour cette action.

    Dans executeIndex
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $this->email = 'toto@exemple.com'
    Et tu la récupère dans le template parCe qui n’empêche pas d'utiliser l'objet user pour un stockage entre les lancements de l'application.

  4. #4
    Membre éclairé
    Inscrit en
    Juillet 2006
    Messages
    747
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 747
    Par défaut
    Ok, merci bien pour vos réponses.

    Alexoos : Oui, j'ai bien "myUser.class.php" qui étend "sfBasicSecurityUser" dans lib.

    Michel : J'aimerai bien transmettre une donnée en session en fait. Du coup, comment dois-je m'y prendre ?

    J'imagine que je dois utiliser l'objet myUser (car il faut bien que la donnée puisse transiter entre les modules).
    Dans le site que je développe, j'ai développé un mécanisme d'authentification et je dois garder le login en session et le détruire à la déconnexion.

    Comment donc créer la variable de session à la connexion (dans mon action et le récupérer dans mon template j'imagine) et également comment le détruire ??

  5. #5
    Expert confirmé
    Avatar de Michel Rotta
    Homme Profil pro
    DPO
    Inscrit en
    Septembre 2005
    Messages
    4 954
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : DPO
    Secteur : Distribution

    Informations forums :
    Inscription : Septembre 2005
    Messages : 4 954
    Par défaut
    A noter que ton objet myUser peut étendre d'autres objet, notamment si tu utilises sfGuard, il faut que le parent soit sfUser et idéalement, sfBasicSecurityUser si tu veux gérer de l’authentification et de la sécurité.

    Pour récupérer les données dans ton template, l'idéal est de les préparer dans le comtrôleur si tu veux garder une indépendance des couches conforme au MVC. En effet, il est possible que dans une évolution future de ton application ces données ne proviennent plus ou plus uniquement de ton objet sfUser.

    L'idée serait donc de créer un tableau en charge des données a transmettre au template, donnée qui seront chargées dans le contrôleur et lue dans le template.

    Dans ton contrôleur (executeIndex)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    $user = $this->getUser();
    $this->parametres['email'] = $user->getEmail();
    $this->parameters['name'] = $user->getName();
    ...
    Et dans ton template
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    <?php echo $parameters['email'] ?>
    <?php echo $parameters['name'] ?>
    Si tu veux réellement avoir un accès à l'objet myUser depuis le template tu peux, dans ton contrôleur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $this->user = $this->getUser();
    et dans ton template
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <?php echo $user->getName() ?>
    Et si tu veux tous faire dans le template (ce que je ne saurais recommander)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    <?php $user = sfContext::getInstence->getUser() ?>
    <?php $user->getName() ?>
    devrait marcher.

    Je pense que la première solution est la meilleur au niveau de l'indépendance des couches et garanti qu'il ne faudra pas modifier le template si les données changent d'origine dans le développement.

  6. #6
    Membre éclairé
    Inscrit en
    Juillet 2006
    Messages
    747
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 747
    Par défaut
    Bon, j'ai probablement du rater une étape.
    Voici le message que j'ai, avec la première des méthodes données :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Notice: Undefined variable: parameters
    La 2ème méthode me donne ceci::

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Notice: Undefined variable: user in F:\wamp\www\WeeTooL\apps\frontend\modules\quizz\templates\indexSuccess.php  on line 1
     
    Fatal error: Call to a member function getName() on a non-object in F:\wamp\www\WeeTooL\apps\frontend\modules\quizz\templates\indexSuccess.php on line 1
    Dois-je faire qq chose avec mon objet myUser ? Il me semble qu'il me manque quelque chose

  7. #7
    Futur Membre du Club
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    5
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France, Haute Vienne (Limousin)

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5
    Par défaut
    Citation Envoyé par Michel Rotta Voir le message
    La variable $sf_user n'existe plus dans le template. Elle a été supprimé lors du passage de la 1.0 à la 1.1 dans mes souvenir.
    Ah ? :/
    Pourtant, j'utilise la version 1.4, et je peux utiliser la variable sf_user.
    Donc je ne comprends pas pourquoi, il instancie toujours ma variable.

    Sinon identifiant_bidon, moi j'allais te conseiller, de faire une méthode login dans myUser :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    // Déclarer la session de l'utilisateur
    $this->setAuthenticated(true);
     
    // On stocke maintenant les informations de l'utilisateur connecté
    // dans une session
    $this->setAttribute('login', $personne->getLogin());
    Pour ma part, dans mes applications de connexion j'appelle la méthode login une fois que le formulaire est validé dans le processForm.
    Je peux ainsi savoir si l'utilisateur est connecté grâce à :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    <?php if ($sf_user->isAuthenticated()): ?>
    // récupérer un attribut de session 
    <?php echo $sf_user->getAttribute('login') ?>
    Etant débutant en développant sur symfony je me trompe peut-être.

  8. #8
    Membre éclairé
    Inscrit en
    Juillet 2006
    Messages
    747
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 747
    Par défaut
    Merci Alexoos

    Je crois avoir cerné mon problème. En fait, le hic est pour faire transiter ma variable de session entre les modules.

    Dans l'action de mon module de login, j'appelle une méthode dans laquelle j'ai cette ligne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $this->getUser()->setName();
    Dans la classe MyUSer, j'ai ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    	public function setName() {
    		$this->setAttribute('name', "test");		
    	}
    Dans un fichier template d'un autre module, je fais ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <?php echo $sf_user->getAttribute('name') ?>
    et j'ai bien ma valeur. Cependant, ce n'est pas le cas dans tous les modules :

    dans un autre module, j'ai ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Notice: Undefined variable: sf_user in F:\wamp\www\WeeTooL\apps\frontend\modules\quizz\templates\indexSuccess.php  on line 1
     
    Fatal error: Call to a member function getAttribute() on a non-object in F:\wamp\www\WeeTooL\apps\frontend\modules\quizz\templates\indexSuccess.php on line 1
    encore et toujours ...

  9. #9
    Expert confirmé
    Avatar de Michel Rotta
    Homme Profil pro
    DPO
    Inscrit en
    Septembre 2005
    Messages
    4 954
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : DPO
    Secteur : Distribution

    Informations forums :
    Inscription : Septembre 2005
    Messages : 4 954
    Par défaut
    Effectivement les variables sf_context, sf_request, sf_params, request, sf_response, sf_user sont toujours instanciées. Simplement elle ne sont plus documentée.

    Par contre, je maintiens que récupérer ces informations dans le template est une mauvaise idée.

    Désolé pour le parameters, il faut initialiser le tableau avant, je le pensais évident. Donc, avant le code de la première solution, il faut rajouter
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $this->parameters = array();
    La méthode getName() de l'objet user n'existe pas, de base, c'est juste un exemple de nom.

    Si tu mets en place une méthode setName sur ton objet user (elle est bonne ta méthode). Mets aussi une méthode
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    public function getName()
    {
        return $this->getAttribute('Name', "N'a pas de nom");
    }
    Ceci n'est qu'un exemple.


    Dans le cas de disparition mystérieuse de valeur sur l'objet user, utilise la barre de débug de symfony, tu peux y consulter l'ensemble des données stockée dans le container de l'objet user.

Discussions similaires

  1. Undefined variable: Idclic
    Par kratos59 dans le forum Langage
    Réponses: 7
    Dernier message: 11/05/2006, 16h50
  2. Notice: Undefined variable
    Par oranoutan dans le forum Langage
    Réponses: 19
    Dernier message: 21/12/2005, 22h28
  3. undefined variable
    Par ept35 dans le forum Langage
    Réponses: 3
    Dernier message: 30/11/2005, 15h48
  4. Notice: Undefined variable
    Par kayn dans le forum Langage
    Réponses: 2
    Dernier message: 03/10/2005, 20h44
  5. Réponses: 3
    Dernier message: 22/09/2005, 11h24

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