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 :

[FOSUserBundle]Personnaliser la classe User [2.x]


Sujet :

Symfony PHP

  1. #1
    Membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2006
    Messages
    71
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Chine

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Janvier 2006
    Messages : 71
    Points : 52
    Points
    52
    Par défaut [FOSUserBundle]Personnaliser la classe User
    Bonjour,

    J'apprends à me servir du bundle FOSUserBundle et rencontre un petit problème après avoir personnalisé ma classe User.

    Pour être cohérent, j'ai aussi crée ma propre classe RegistrationFormType et RegistrationFormHandler, pour obtenir les infos lors de l'enregistrement d'un nouvel utilisateur.

    Comme je ne veux pas de champ username (mes utilisateurs s'authentifient à partir de l'email), je n'ai pas mis parent::buildForm($builder, $options); dans mon RegistrationFormType.
    Voici le code de ma classe :

    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
    class RegistrationFormType extends BaseType
    {
        public function buildForm(FormBuilder $builder, array $options)
        {
            // add your custom field
            $builder
                ->add('username')
                ->add('email', 'email')
                ->add('plainPassword', 'repeated', array('type' => 'password'))
                ->add('name', null, array(
                    'label' => 'Name:',
                ))
                ->add('familyName', null, array(
                    'label' => 'Family name:',
                ))
                ->add('birthdate', 'birthday', array(
                    'label' => 'Birthday:',
                ))
                ->add('city', null, array(
                    'label' => 'City:',
                ))
                ->add('sex','choice', array(
                    'choices' => array(1 => 'Male', 2 => 'Female'),
                    'label' => 'Gender',
                    ));        
        }
     
        public function getName()
        {
            return 'yop_user_registration';
        }
    }
    Mon Handler, lui, appelle parent::onSuccess($user, $confirmation);

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    class RegistrationFormHandler extends BaseHandler
    {
        protected function onSuccess(UserInterface $user, $confirmation)
        {
            // Note: if you plan on modifying the user then do it before calling the
            // parent method as the parent method will flush the changes
            $user->setPoemsLeft(1);
     
            parent::onSuccess($user, $confirmation);
     
            // otherwise add your functionality here
        }
    }
    Ce qui pose un problème, j'ai comme message d'erreur "please input the username".

    Je pense comprendre qu'il ne faut pas que j'utilise le parent::onSuccess($user, $confirmation); ?

    Seulement je n'ai pas trouvé le code où la vérification des données est effectuée ? Ou cela se trouve-t-il ?
    Si je dois faire toutes les vérifs de champ moi-même, de quoi puis-je m'inspirer et où le code doit-il se trouver ?

    Accessoirement, j'ai un champ poemsLeft pour ma classe User, que je souhaite remplir moi-même et ne pas le faire apparaître dans la Form.
    Je pensais que ce serait ok avec la ligne : $user->setPoemsLeft(1);

    Mais apparemment non, puisque j'ai aussi le message d'erreur : SQLSTATE[23000]: Integrity constraint violation: 1048 Column 'poemsLeft' cannot be null

    A quel moment puis-je remplir le champ PoemsLeft de mon User ?

    Si vous avez une ptite piste à me donner, ce serait sympa.
    Merci d'avance!

  2. #2
    Membre du Club
    Homme Profil pro
    Webmaster
    Inscrit en
    Août 2006
    Messages
    55
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Webmaster
    Secteur : Santé

    Informations forums :
    Inscription : Août 2006
    Messages : 55
    Points : 46
    Points
    46
    Par défaut
    Étant également dans le cas d'une application où les utilisateurs s'identifient uniquement par leur adresse mail, j'ai plutôt opté pour une solution moins propre mais risquant moins d'induire des failles dans le FOSUB :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    //Dans le onSuccess du Handler
    $user->setUsername($user->getEmail());
    Ça duplique l'information, c'est pas top mais au moins je ne casse pas le FOSUB et je profite toujours facilement des éventuelles mise à jour du bundle.

    Après, je suivrais avec intérêt ta démarche si tu réussis à virer proprement le username du FOSUB.

  3. #3
    Membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2006
    Messages
    71
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Chine

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Janvier 2006
    Messages : 71
    Points : 52
    Points
    52
    Par défaut
    Pas bête.
    Mais comment fais tu pour valider ta form sans username ?
    Dans mon cas j'ai "Please enter a username", je n'arrive jamais au onSuccess si je ne rajoute pas le champ username dans ma form...

    De plus même lorsque j'arrive jusqu'au onSuccess, on dirait que le code qui y est contenu ne fonctionne pas (en l'occurence $user->setPoemsLeft(1) )...

    Pour te passer proprement du username, tu peux créer une classe MyUserProvider et surcharger la fonction loadUserByName (cf doc FOSUB)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
        public function loadUserByUsername($email)
        {
            $user = $this->userManager->findUserByEmail($email);
     
            if (!$user) {
                throw new UsernameNotFoundException(sprintf('No user with email "%s" was found.', $email));
            }
     
            return $user;
        }

  4. #4
    Membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2006
    Messages
    71
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Chine

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Janvier 2006
    Messages : 71
    Points : 52
    Points
    52
    Par défaut
    J'ai pu trouver une solution à mon problème : Lien Stack Overflow (anglais)

    En gros, j'ai dû créer ma propre validation dans validation.yml et un validation group pour l'inscription. Puis associer le validation group avec ma validation dans app.config.yml :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    fos_user:
        db_driver: orm
        firewall_name: main
        user_class: App\UserBundle\Entity\User
        registration:
            form:
                type: app_user_registration
                validation_groups: [AppRegistration]
    Je garde la solution de CaraG33k pour avoir une valeur dans mon champ username.

    Du coup je peux ma form pour enregistrer mes utilisateurs.

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

Discussions similaires

  1. [2.x] [FOSUserBundle] enlever le mot user de la page de profil !
    Par montis dans le forum Symfony
    Réponses: 1
    Dernier message: 27/09/2012, 17h00
  2. [2.x] [FOSUserBundle] Personnalisation de la fiche d'inscription
    Par MarronSuisse dans le forum Symfony
    Réponses: 7
    Dernier message: 13/08/2012, 13h02
  3. [2.x] [FOSUserBundle] Personnaliser les champs de la table User
    Par Dinduks dans le forum Symfony
    Réponses: 4
    Dernier message: 11/07/2012, 17h25
  4. Utilisation d'une classe User
    Par Jenojen dans le forum Langage
    Réponses: 6
    Dernier message: 07/04/2011, 12h49
  5. [WS 2003] comment remplir attribut uid dans classe user Active directory
    Par ouadie99 dans le forum Windows Serveur
    Réponses: 1
    Dernier message: 13/08/2009, 11h23

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