[RESOLU] PHP Faker

Eléphanteau du PHP | 16 Messages

01 mars 2021, 13:52

Bonjour,
J'utilise phpFaker avec le framework Symfony 5 et je tombe sur un 'os':
Dans un fichier AppFixtures.php, je demande à faker de choisir parmi trois items : 'ancien', 'professeur' et 'contact' avec la commande :
$qualite = $faker->randomElement(['ancien', 'contact', 'professeur']);
Si je demande un dump() de la $qualite, j'obtiens :
^ "ancien"
soit une réponse cohérente.

Et si je demande :
$user->getQualite()
J'obtiens :
^ true
Dans tous les cas, sur ma base de données la commande rend la valeur true soit = 1.

Quelqu'un pourrait-il m'éclairer ?

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

03 mars 2021, 13:15

Salutations !

Que fait la méthode getQualite() ? qu'elle retourne simplement l'attribut qualite de ton instance user ?
Si tel est le cas, à quel moment cet attribut est-il renseigné pour l'instance $user ?

$qualite est différent de $this->qualite, dans le premier cas c'est une variable, dans le second c'est un attribut de ta classe :)
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Eléphanteau du PHP | 16 Messages

03 mars 2021, 15:34

Merci Ryle,
La méthode getQualite() retourne la propriété qualite de l'instance User.
La propriété est renseignée en fin d'extrait (ci-dessous) par la méthode setQualite() de User.

Voici le contexte, il s'agit de populariser une 'fake' base de données:
        for ($p = 1; $p < 50; $p++) {
            $user = new Personne;
            dump($user);

            $hash = $this->encoder->encodePassword($user, "password");
            $user->setTitre($faker->title($gender = 'male' | 'female'))
                ->setNom($faker->lastName())
                ->setPrenom($faker->firstName())
                ->setEntreeStjo($faker->numberBetween(1948, 1990))
                ->setSortieStjo($user->getEntreeStjo() + $faker->numberBetween(3, 7))
                ->setProfession($faker->jobTitle())
                ->setDateCreation($faker->dateTimeBetween('-6 months'))
                ->setDateMiseAJour($faker->dateTimeBetween('- 7 days'))
                ->setRefuseContact($faker->boolean(5))
                ->setRole("ROLE_USER")
                ->setEnvoiPapier($faker->boolean(1))
                ->setPassword($hash)
                ->setAdresse1($faker->streetAddress())
                ->setAdresse2($faker->secondaryAddress())
                ->setCodePostal($faker->postcode())
                ->setVille($faker->city())
                ->setPays($faker->country());
            $qualite = $faker->randomElement(['ancien', 'contact', 'professeur']);
            dump($qualite);

            $user->setQualite($qualite);
            dd($user);
Après l'instruction $user= new User, en début de script, un dump montre la propriété "qualite" : NULL (bien sûr l'objet est "neuf").
A la fin du script, le dump de "qualite" affiche bien une chaîne de caractères résultante de la commande randomElement (ex. professeur).
J'exécute ensuite la fonction setQualite de user pour lui attribuer la qualite obtenue (string).
Problème: le dump de user montre : qualite=true (cf. ci-dessous).
En base de données : 1
-avatarPersonne: null
  -envoiPapier: false
  -qualite: true

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

03 mars 2021, 17:23

Tout semble logique au niveau de ton code. Il faudrait donc vérifier dans ta classe Personne, que l'attribut qualite est bien de type string et pas de type bool (ou n'est pas typé selon la façon dont tu code) et t'assurer que le setQualite() ne fait effectivement rien de plus de d'affecter la valeur spécifiée sans l'altérer :)
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Eléphanteau du PHP | 16 Messages

03 mars 2021, 17:31

Dans l'entité Personne :
  /**
     * @ORM\Column(type="string", nullable=false)
     */
    private $qualite;
Dans la base :
Nom Type Interclassement Attributs Null Valeur par défaut
qualite varchar(255) utf8mb4_unicode_ci Non Aucun(e)

Enfin setQualite() :
   public function setQualite(?bool $qualite): self
    {
        $this->qualite = $qualite;

        return $this;
    }

Eléphanteau du PHP | 16 Messages

03 mars 2021, 17:35

çà y est j'est vu la bestiole : setQualite(?bool $qualite) !!! Le hic est dans a fonction !

Eléphanteau du PHP | 16 Messages

03 mars 2021, 17:36

Merci encore Ryle !
Comme quoi, ce qui est en face de nous peut-être invisible !!

Eléphanteau du PHP | 16 Messages

03 mars 2021, 17:38

TadaaaM !
-envoiPapier: false
  -qualite: "professeur"
  -password: "$argon2id$v=19$m=65536,t=4,p=1$hoYn9u2ColcNwakAoQUUrw$iB57aAxrXvtT2O6TArPYoCXATBvyvS3nU3OT3UVolxk"

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

04 mars 2021, 12:07

Cool !

Content que tu ais pu solutionner le problème :)
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...