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 :

Asserts private Roles


Sujet :

Symfony PHP

  1. #1
    Membre régulier
    Asserts private Roles
    Bonjour,

    j'aimerai comprendre le fonctionnement de roles dans la gestion des utilisateurs dans symfony 4

    J'ai implémenté une class Player avec UserInterface. Si j'ai bien compris cela m'impose d'importer 5 fonctions obligatoires.

    Je bloque sur la gestion du Json

    voici mon code


    Entity Player
    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
     
    ...
    class Player implements UserInterface
    {
     const ROLESALLOWED = ['ROLE_PLAYER', 'ROLE_POLISTE'];
     
    ..
    /**
    * @var array
    *
    * @ORM\Column(type="json")
    * @Assert\Choice(choices=Player::ROLESALLOWED, message="ROLE INVALIDE.")
    * 
    */
    private $roles = [];
    ...
    public function getRoles()
    {
     $roles = $this->roles;
     
     // Afin d'être sûr qu'un user a toujours au moins 1 rôle
     if (empty($roles)) {
      $roles[] = 'ROLE_PLAYER';
     }
     return array_unique($roles);
    }
     
    public function setRoles(array $roles): void
     {
      $this->roles = $roles;
     }


    PlayerController
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    ...
    $player->setPassword($passwordCrypt)
     ->setConfirmedAt($today)
     ->setRoles(['ROLE_PLAYER']);
    ...


    J'ai un retour comme quoi le ROLE_PLAYER est invalide. Message = ROLE INVALIDE

    La structure de ma table pour la colonne "roles" :
    type : longtext
    interclassement : UTF8mb4_general_ci
    null : non
    commentaires : DC2Type:json
    ...

    Est-ce vraiment du Json ? quel est le bon format ?

    J'ai également des problèmes dans mes requêts SQL sur cette colonne ?

    Avez-vous des conseils ?

    merci pour votre retour

  2. #2
    Membre émérite
    Ce message n'a pas pu être affiché car il comporte des erreurs.
    Alexandre Tranchant
    Chef de projet AMO pour le Cerema.
    Retrouvez mes articles sur PHP et Symfony

  3. #3
    Membre régulier
    Bonjour,

    Merci pour votre retour. Voici mon controller

    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
    33
    34
    35
    36
    37
    38
    39
    40
    41
     public function playerRegister(FunctionsRandom $functionsRandom, Request $request, EntityManagerInterface $manager, UserPasswordEncoderInterface $encoder)
    {
     $player = new Player();
     $form = $this->createForm(PlayerType::class, $player);
    
     $form->handleRequest($request);
    
     if ($form->isSubmitted() && $form->isValid()) {
    
     $user = $this->getUser();
     $userId = $user->getId();
    
    ....
     $zoneId               = $form->get('departement')->getData()->getIdZone();
     $password             = $functionsRandom->generateChainRandom(9);
     $passwordCrypt        = $encoder->encodePassword($user, $password);
     $today                = new DateTime('now');
    
    
    
    $player->setZoneLicence($zoneId)
     ->setUser($user)
     ->setCategorie($categorie)
     ->setNbreMois($intervalMoisTotal)
     ->setPassword($passwordCrypt)
     ->setConfirmedAt($today)
     ->setRoles(["ROLE_PLAYER"]);  // J'insère manuellement cette valeur 
    
     $manager->persist($player);
     $manager->flush();
    
     $this->addFlash("success", "Félicitations, votre enregistrement.... !");
    
      return $this->redirectToRoute('playRegister');
     }
    
     return $this->render('par/playRegister.html.twig', [
      'form' => $form->createView()
     ]);
    }

  4. #4
    Membre émérite
    C'est bien ce que je pensais, le formulaire est invalide, car le rôle n'est pas spécifié (dans le formulaire). Tu l'ajoutes par la suite.
    Tu peux commencer par ajouter cette ligne :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    $player->setRoles(['ROLE_PLAYER']);
    avant cette ligne :

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    $form = $this->createForm(PlayerType::class, $player);


    La meilleure pratique serait de modifier ton formulaire pour qu'il ne dépende plus de l'entité Player, mais d'un modèle.
    La ligne suivante :

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    'data_class' => Player::class ,


    doit être remplacé par :

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    'data_class' => PlayerModel::class,


    Ensuite, tu crées une classe PlayerModel comme décrit dans ce tutoriel :
    https://symfonycasts.com/screencast/...forms/form-dto

    Une solution à très court terme serait de supprimer cette assertion sur ton rôle, puisque tu le remplis toi-même dans le contrôleur manuellement.

    Une variante à très court terme Si tu as besoin de cet assertion pour l'administration des Player, je te recommande d'ajouter un groupe pour qu'il ne soit plus utiliser lors de l'inscription, mais uniquement dans l'administration.
    https://symfony.com/doc/current/form...on_groups.html
    https://symfony.com/doc/current/vali...on/groups.html

    Une information très importante aussi : Tout utilisateur connecté et inscrit reçoit automatiquement le ROLE_USER. Donc à mon avis, tu devrais pouvoir te passer de ce ROLE_PLAYER.
    Alexandre Tranchant
    Chef de projet AMO pour le Cerema.
    Retrouvez mes articles sur PHP et Symfony

  5. #5
    Membre régulier
    Merci pour vos explications très précieuses car elles me permettent d'un peu mieux comprendre.

    Je vais essayer de mettre en oeuvre la Form Model Class car j'ai beaucoup de formulaire qui reprennent que partiellement mes entités voir pas du tout

    Dans le même esprit, j'aimerai utiliser google charts gauge comme base d'un formulaire. L'idée est de récupérer les valeurs de 5 gauges pour les envoyer à mon controller

    https://developers.google.com/chart/.../gallery/gauge

    Le problème est que c'est du javascript. Quelle est la bonne pratique ?

    1 .Ajax et je dois être réorienter vers une nouvelle page.

    2. créer un formulaire dans lequel j'insère les valeurs javascript récupérées sur un addeventListenner

    .....

    Puis j'aurai le pb de la validation (faut-il que je valide les datas avec une fonction dans mon controller ou service ?)

    Je vous présente un bout de code pour illustrer ma demande ?

    Code HTML :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    ....
            <div class="gauge_graph">
                <div id="gauge_fatigue" class="gauge_div"></div>
                <div class="gauge_div_btn">
                    <button type="button"  onclick="changeTempFatigue(-1)" class="btn btn-light gauge_btn"/>-</button>
                    <button type="button"  onclick="changeTempFatigue(1)" class="btn btn-light gauge_btn ml-3" />+</button> 
     
                </div>
            </div>
    ....
     
        <div id=""class="form-group text-center mt-2 mb-4">
            <input type="submit" value="Enregistrer" class="btn login_btn" id="btnSubmit"> 
        </div>



    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
    33
        var btnSubmit = document.getElementById('btnSubmit');
        //console.log(btnSubmit);
     
        btnSubmit.addEventListener('click', function() {
            //console.log('bloqué'); 
     
            var texts = document.getElementsByTagName('text');
     
            var fatigue         = texts[3].innerHTML;
            var sommeil         = texts[7].innerHTML;
            var douleur         = texts[11].innerHTML;
            var stress          = texts[15].innerHTML;
            var alimentation    = texts[19].innerHTML;
     
            var formData = new FormData();
     
            formData.append("fatigue", fatigue);
            formData.append("sommeil", sommeil);
            formData.append("douleur", douleur);
            formData.append("stress", stress);
            formData.append("alimentation", alimentation);    
     
            var urlAjax = "{{ path('TraitAjaxReleveSante') }}"; 
                fetch(urlAjax, {
                    method: 'POST',
                    body: formData
                })
                .then(function (response) {
                    return response.json();
                })
                .then(function(objetResponse){
     
                });


    je récupère bien toutes les valeurs dans mon controller mais est-ce une bonne pratique ?

    Par ailleurs, donnez-vous des cours ou tutorat car je cherche un expert qui pourrait m'accompagner sur ces problématiques ?

    D'ailleurs je ne sais pas si je peux demander cela içi donc veuillez m'en excuser par avance

  6. #6
    Membre émérite
    Bonjour,

    Si vous avez beaucoup de formulaires qui ne reprennent qu'une partie des formulaires, les modèles sont la meilleure solution pour bien garder un code simple à comprendre et à reprendre en maintenance.

    Pour le reste, je ne suis pas sûr de tout comprendre, mais vous avez deux solutions :
    • c'est le backend (Symfony) qui interroge le serveur google avec les fonctions curl. Votre controlleur construit alors une vue avec les données reçues comme s'il les avait lues dans une base de données ;
    • la seconde option, c'est votre front-end qui interroge directement Google et qui se passe donc totalement de votre backend.


    Pour savoir qu'elle est la meilleure solution, cela va dépendre de beaucoup de choses. Si vous avez besoin que votre backend améliore/traite/interprète/journalise les données de Google, vous devrez optez pour la première option.
    Si votre backend se moque de ce que Google renvoie ou non, alors autant libérer votre serveur de cela, alors vous pouvez opter pour la seconde solution.
    Alexandre Tranchant
    Chef de projet AMO pour le Cerema.
    Retrouvez mes articles sur PHP et Symfony

  7. #7
    Membre régulier
    Je vais tenter d'être plus clair :

    j'ai un template twig dans lequel j'utilise google charts gauge qui permet à l'utilisateur de renseigner des valeurs en cliquant sur des boutons. (5 gauges + un bouton 'enregistrer').

    Voir : GAUGE EXAMPLE : https://developers.google.com/chart/.../docs/examples


    Cependant, cela reste du javascript (côté front). J'aimerai récupérer ces valeurs et les envoyer dans mon controller.

    Mais bien entendu cela n'est pas un formulaire et j'utilise AJAX - method POST pour y parvenir (ok j'y arrive).

    Est-ce une bonne pratique ? ou bien en existe t'il une autre ?

    je vais explorer les fonctions curl et tout ce que vous m'avez suggérer pour apprendre.

  8. #8
    Membre émérite
    Merci des précisions, je n'avais pas compris en effet.

    La solution avec ajax et la method post est très bien. Cette méthode de votre contrôleur peut retourner un JsonResponse au lieu d'une réponse plus conventionnelle retournant un twig.
    Alexandre Tranchant
    Chef de projet AMO pour le Cerema.
    Retrouvez mes articles sur PHP et Symfony

  9. #9
    Membre régulier
    J'arrive à retourner une jsonResponse mais j'aimerai savoir si je pouvais faire une redirection ? par exemple sur ma homePage ?