Formulaire renvoi valeurs NULL

a marqué ce sujet comme résolu.

Bonjour à tous !

Je suis en train de mettre en place un système d’inscription et je fait face à un problème assez bizarre.

Tout ce passe bien jusqu’au moment où le formulaire est soumis. Je me retrouve avec des valeurs à NULL mais là où c’est encore + bizarre, c’est qu’il y a 2 champs (username et password) qui ont bien les valeurs envoyées mais pas le reste, ce qui me laisse assez perplexe.

Voici mon code :

UserController

 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
<?php
/**
     * @Route("inscription", name="registration")
     */
    public function register(Request $request)
    {
        $user = new User();
        $form = $this->createForm(RegisterType::class, $user);

        $form->handleRequest($request);

        if($form->isSubmitted() && $form->isValid())
        {
            $session = new Session();

            $session->set('user', $user);
            $session->set('req', $request);

            return $this->redirectToRoute('index');
        }

        return $this->render('utils/registration.html.twig', array(
            'registerForm' => $form->createView(),
        ));
    }
?>

RegisterType

 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
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
<?php
class RegisterType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('username', TextType::class, array(
                'attr' => array('placeholder' => 'Pseudo'),
                'label' => false
            ))
            ->add('password', PasswordType::class, array(
                'attr' => array('placeholder' => 'Mot de passe'),
                'label' => false
            ))
            ->add('confirmPassword', PasswordType::class, array(
                'attr' => array('placeholder' => 'Confimer le mot de passe'),
                'label' => false,
                'mapped' => false
            ))
            ->add('email', EmailType::class, array(
                'attr' => array('placeholder' => 'Email'),
                'label' => false
            ))
            ->add('firstName', TextType::class, array(
                'attr' => array('placeholder' => 'Prénom'),
                'label' => false
            ))
            ->add('lastName', TextType::class, array(
                'attr' => array('placeholder' => 'Nom'),
                'label' => false
            ))
            ->add('phoneN1', TelType::class, array(
                'attr' => array('placeholder' => 'Téléphone fixe'),
                'label' => false
            ))
            ->add('phoneN2', TelType::class, array(
                'attr' => array('placeholder' => 'Téléphone mobile'),
                'label' => false
            ))
            ->add('address', TextType::class, array(
                'attr' => array('placeholder' => 'Rue'),
                'label' => false
            ))
            ->add('birthdate', BirthdayType::class, array(
                'widget' => 'single_text'
            ))
            ->add('city', EntityType::class, array(
                'class' => City::class,
                'query_builder' => function(EntityRepository $er){
                    return $er->createQueryBuilder('listCities')
                        ->orderBy('listCities.npa', 'ASC');
                }
            ))
            ->add('cgu', CheckboxType::class, array(
                'label' => 'J\'ai lu et j\'accepte les conditions générales d\'utilisation',
                'mapped' => false
            ))
            ->add('register', SubmitType::class, array(
                'attr' => array('class' => 'btn btn-primary'),
                'label' => 'S\'inscrire'
            ))
        ;
    }

    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults([
            'data_class' => User::class,
        ]);
    }
}
?>

Je vous mets également le fichier security.yaml, au cas où :

 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
security:
    encoders:
        App\Entity\User:
            algorithm: bcrypt
    providers:
        #in_memory: { memory: ~ }
        user_provider:
            entity:
              class: App\Entity\User
              property: username
    firewalls:
        dev:
            pattern: ^/(_(profiler|wdt)|css|images|js)/
            security: false
        main:
            anonymous: true
            pattern: ^/
            http_basic: true
            provider: user_provider
            form_login:
                login_path: login
                check_path: login
    access_control:
        - { path: ^/admin, roles: ROLE_ADMIN }
        - { path: ^/ajouter-une-annonce, roles: ROLE_USER }
        - { path: ^/gerer-mes-annonces, roles: ROLE_USER }
        - { path: ^/mon-compte, roles: ROLE_USER }

J’ai beau regarder encore et encore la doc Symfony, je ne vois pas pour quelle(s) raison(s) les données ne sont pas transmises.

Merci d’avance !

+0 -0

Salut !

Est-ce qu’on pourrait voir les mappings de la classe User ?
J’aimerais aussi volontiers savoir si c’est bien ton action et pas une autre qui est appelée une fois le formulaire soumis.

Si jamais, pour le mot de passe et sa confirmation, il existe un RepeatedType qui ne va te retourner qu’une valeur et automatiquement vérifier que les deux saisies sont identiques.

+0 -0

Ah ! Je n’avais pas fait attention au type RepeatedType.

Voici ma classe User :

 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
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
<?php
class User implements UserInterface, \Serializable
{
    /**
     * @ORM\Id()
     * @ORM\GeneratedValue()
     * @ORM\Column(type="integer")
     */
    private $id;

    /**
     * @ORM\Column(type="string", length=50)
     */
    private $username;

    /**
     * @ORM\Column(type="string", length=255)
     */
    private $password;

    /**
     * @ORM\Column(type="string", length=50)
     */
    private $email;

    /**
     * @ORM\Column(type="string", length=50)
     */
    private $firstName;

    /**
     * @ORM\Column(type="string", length=50)
     */
    private $lastName;

    /**
     * @ORM\Column(type="integer")
     */
    private $phoneN1;

    /**
     * @ORM\Column(type="integer", nullable=true)
     */
    private $phoneN2;

    /**
     * @ORM\Column(type="string", length=50)
     */
    private $address;

    /**
     * @ORM\Column(type="date")
     */
    private $birthdate;

    /**
     * @ORM\Column(type="datetime", nullable=true)
     */
    private $lastLogin;

    /**
     * @ORM\Column(type="string", length=10, nullable=true)
     */
    private $picture;

    /**
     * @ORM\Column(type="string", length=255, nullable=true)
     */
    private $hash;

    /**
     * @ORM\Column(type="boolean")
     */
    private $isActive;

    /**
     * @ORM\ManyToOne(targetEntity="App\Entity\City", inversedBy="users")
     * @ORM\JoinColumn(nullable=false)
     */
    private $city;

    /**
     * @ORM\OneToMany(targetEntity="App\Entity\Postulation", mappedBy="user")
     */
    private $postulations;

    /**
     * @ORM\OneToMany(targetEntity="App\Entity\JobOffer", mappedBy="user")
     */
    private $jobOffers;

    /**
     * @ORM\OneToMany(targetEntity="App\Entity\Document", mappedBy="user")
     */
    private $documents;
?>

Concernant le fait que cela soit une autre action, si c’était le cas, je ne pourrais pas afficher les variables de session user & req, non ? Vu qu’elles n’existeraient pas.

+0 -0

OK, donc c’est quelque chose entre la soumission du formulaire et le traitement dans le contrôleur qui doit poser problème.

Je ne suis plus du tout sûr, mais il me semble que FosUserBundle demandait de spécifier d’une manière ou d’une autre le formulaire qui serait utilisé à l’enregistrement. Peut-être que c’est aussi le cas ici, parce que le firewall n’a la certitude que de certains champs par UserInterface ?

+0 -0

Je ne pense pas vu que le formulaire est "lié", en quelque sorte, à l’entité User, d’où la non-nécessité de mapper les champs.

Si je regarde la doc, il ne parle du firewall.

Cela me laisse perplexe car j’avait déjà fait cela auparavant et je n’avais eu aucun problème.

J’ose demander précision sur le fait que c’est bien l’entité User juste après handleRequest() qui ne contient pas toutes les données de l’utilisateur, ou c’est à une autre étape ?

Aussi, est-ce que la requête contient toutes les informations avant handleRequest() ?

+0 -0

J’ose demander précision sur le fait que c’est bien l’entité User juste après handleRequest() qui ne contient pas toutes les données de l’utilisateur, ou c’est à une autre étape ?

Je ne suis pas sûr de quelle ligne tu parles. Si tu parles du moment où je créé la variable de session user, normalement, il s’agit d’un User "neuf" qui ne contient aucune données.

Aussi, est-ce que la requête contient toutes les informations avant handleRequest() ?

Voici ce que contient ma variable de session $req avec des données bidons :

1
#content: "register%5Busername%5D=test&register%5Bpassword%5D%5Bfirst%5D=te&register%5Bpassword%5D%5Bsecond%5D=te&register%5BlastName%5D=te&register%5BfirstName%5D=te&register%5Bbirthdate%5D=2069-06-15&register%5Bemail%5D=cadsad%40test.com&register%5BphoneN1%5D=123213&register%5BphoneN2%5D=132133&register%5Baddress%5D=Temple+12&register%5Bcity%5D=3&register%5Bcgu%5D=1&register%5Bregister%5D=&register%5B_token%5D=Q8DD2PcFQTWqN4Ra4MWbPUxeksn5grop3_60sdCBCHk"

Je ne suis pas sûr de quelle ligne tu parles.

Charvalos

La 10 du code fourni pour l’action du contrôleur. Après celle-ci, ta variable $user devrait ne plus avoir toutes ses propriétés qui sont encore nulles, et j’aimerais justement savoir lesquelles. Avant la ligne 10, aucun risque de voir quoi que ce soit d’intéressant, mais après, ça m’intéresse.

+0 -0

Oui, il n’y a pas deux codes d’une action d’un contrôleur, et la numérotation fait que la ligne 10 est unique  :lol:

C’est cette ligne que gère le "placement" des valeurs envoyées avec la requête dans l’entité. Donc il faut savoir si c’est ce "placement" qui pose problème.

En fait, je cherche à savoir comment et où tu as testé pour savoir que ton entité User n’était pas "complète", tout en te faisant chercher aussi plus précisément.

+0 -0

Ah !

En fait, les valeurs que je récupère si le formulaire est valide & a été soumis, je les mets dans la variable de session $user, d’où le $session->set('user', $user);. Ensuite, je fait juste un {{ dump() }} de la variable de session dans ma page d’index.

J’ai fait ça pour tester (c’est la seule solution que j’ai trouvée) que le formulaire fonctionne correctement et renvoie les bonnes valeurs avant de m’attaquer à l’inscription en elle-même.

J’espère que c’est ça que tu voulais savoir. ^^

+0 -0

Cela ne me dit pas si, après que la requête ait été traitée par le formulaire, les données sont bien dans l’entité User. Tu dis que l’entité est valide, mais je ne vois pas de validation, donc comment sait-on que ce n’est pas lors de l’étape de traitement de la requête qu’il y a quelque chose qui ne va pas ? Parce qu’entre la soumission du formulaire et l’affichage, il y a toute une série d’étapes à vérifier…

Ensuite, cette histoire de seulement le nom d’utilisateur et le mot de passe, je soupçonne que ça vient de ce que ce sont deux éléments qui doivent être récupérables du fait de l’implémentation de UserInterface. Tu as implémenté Serializable, peut-on voir tes méthodes serialize() et unserialize()?

+0 -0

Cela ne me dit pas si, après que la requête ait été traitée par le formulaire, les données sont bien dans l’entité User. Tu dis que l’entité est valide, mais je ne vois pas de validation, donc comment sait-on que ce n’est pas lors de l’étape de traitement de la requête qu’il y a quelque chose qui ne va pas ? Parce qu’entre la soumission du formulaire et l’affichage, il y a toute une série d’étapes à vérifier…

J’avais oublié de remettre $session->set('user', $form->getData()); mais en affichant cette variable de session sur ma page d’index, il y a toujours les valeurs à NULL sauf pour le username & le password. Je n’affiche rien, pour le moment, des données propres à l’entité User. Tout ce j’affiche vient directement du formulaire.

Ensuite, cette histoire de seulement le nom d’utilisateur et le mot de passe, je soupçonne que ça vient de ce que ce sont deux éléments qui doivent être récupérables du fait de l’implémentation de UserInterface. Tu as implémenté Serializable, peut-on voir tes méthodes serialize() et unserialize()?

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
<?php
    public function serialize()
    {
        return serialize(array(
            $this->id,
            $this->username,
            $this->password
        ));
    }

    public function unserialize($serialized)
    {
        list(
            $this->id,
            $this->username,
            $this->password
            ) = unserialize($serialized, array('allowed_class' => false));
    }
?>
+0 -0

Pour le coup, le fait qu’en session tu n’aies que les ID, nom d’utilisateur et mot de passe, vu ce que tu listes dans les deux méthodes, il ne faut pas trop s’étonner  :p

Mais je ne comprends toujours pas où ni comment exactement tu as affiché ton utilisateur pour voir ce qu’il contenait.

Donc du coup, ajoute exit(dump($user)) à la ligne 11, et regarde si là aussi il n’y a pas ces valeurs manquantes.

+0 -0

Suis con. J’avais oublié ces deux fonctions. :ninja:

J’ai une belle erreur en faisant l’exit où il me dit que l’entité ne peut pas être transformé en string.

Par contre, je ne sais pas si c’est lié mais dès que je change quelque chose dans la fonction de serialisation, le site charge indéfiniment.

+0 -0

Tu utilises quelle version de Symfony ? Parce que je me suis souvent amusé à faire ce genre de débogage avec des versions de Symfony allant de la 2.8 à la 4.1, et je n’ai jamais eu besoin d’implémenter __toString() pour les entités que je voulais inspecter, et celles qui l’avaient n’étaient pas converties…

A tout hasard, remplace par dump($user); exit(); plutôt que d’imbriquer les deux ?

+0 -0

J’utilise la dernière en date.

Effectivement, c’est ok. Cette manière de noter fonctionne et j’ai bien toutes mes données.

En fait, le problème venait bien de cette fonction serializable et je n’avais, finalement, aucun problème depuis le début. :ange:

+0 -0
Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte