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 :

Valider des données différement selon les rôles [2.x]


Sujet :

Symfony PHP

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 39
    Points : 34
    Points
    34
    Par défaut Valider des données différement selon les rôles
    Bonjour à tous

    Pour mon application, j'ai une problématique un peu spéciale : je doit valider une date différement selon le rôle de l'utilisateur.

    Concrètement un utilisateur connecté peux entrer une date dans une fourchette donnée alors que l'adminstrateur peut entrer n'importe quelle date.

    J'ai implémenté ça en suivant la documentation http://symfony.com/doc/current/cookb...onstraint.html

    Mais dans ce cas la date est validé tout le temps de la même manière.

    Pour pouvoir retrouver le rôle de mon utilisateur, j'ai voulu injecter le container dans le validateur de la manière suivante.

    services.yml

    XXX.dateDebut_validator:
    class: XXX\YYYBundle\Validator\Constraints\DateDebutValidator
    arguments: [@service_container]
    tags:
    - { name: validator.constraint_validator, alias: date_debut }
    dans mon fichier DateDebut Validator,
    J'ai rajouter le code suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    <?php
    private $_container;
     
        public function __construct()
        {
            $this->_container = $container;
        }
     
    ?>
    J'ai alors le message d'erreur suivant :

    Warning: Missing argument 1 for XXX\YYYBundle\Validator\Constraints\DateDebutValidator::__construct(), called in .../.../vendor/symfony/src/Symfony/Bundle/FrameworkBundle/Validator/ConstraintValidatorFactory.php on line 67 and defined in .../.../pedagiciel/src/Pedagiciels/DemandeBundle/Validator/Constraints/DateDebutValidator.php line 13

    Est-ce que quelqu'un a déjà rencontrer cette problèmatique ?

    Merci d'avance pour vos retour.

  2. #2
    Membre habitué
    Homme Profil pro
    Chef d'entreprise
    Inscrit en
    Mai 2011
    Messages
    122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chef d'entreprise
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mai 2011
    Messages : 122
    Points : 169
    Points
    169
    Par défaut
    Bonjour,

    Le message d'erreur te dit tout: il manque un argument dans ton constructeur. En effet, tu appelles le service "service_container" en argument de ton service, il faut donc le transmettre via ton constructeur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    <?php
    private $container;
     
        public function __construct($container) {
            $this->container = $container;
        }
     
    ?>

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 39
    Points : 34
    Points
    34
    Par défaut
    Pardon je me suis trompé en recopiant le code précédent. J'avais bien passé le container au constructeur.

    J'ai fait le test en passant 2, 3, 4 paramètres et le problème subsiste.

    A mon avis le problème viens de l'appel du validator dans mon entité via les annotations

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    <?php
    /**
     * @ORM\Column(type="datetime")
     * @Assert\NotBlank(message="Le champs date ne doit pas être vide")
     * @Assert\DateTime()
      * @PedagicielsAssert\DateDebut()
      */
        protected $dateDebut;
    ?>
    Effectivement, le container n'est pas passé dans l'annotation.

    Il faudrait une annotation de type @PedagicielsAssert\DateDebut(XXX)

    Où XXX serait le container. Mais comment faire?
    Doit-je déclarer mon entité comme un service dans le seul but de lui injecter le container ?

    Si quelqu'un a déjà rencontré ce problème, merci pour vos retours.

  4. #4
    Membre habitué
    Homme Profil pro
    Chef d'entreprise
    Inscrit en
    Mai 2011
    Messages
    122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chef d'entreprise
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mai 2011
    Messages : 122
    Points : 169
    Points
    169
    Par défaut
    C'est curieux d'avoir une message te disant que l'argument 1 soit absent si tu le remplis dans la méthode concernée.

    Quoiqu'il en soit, je pense que la solution pour toi se situe au niveau des validation groups. Cela te permettra de lancer la validation complète pour les utilisateurs et seulement la validation du format date pour les administrateurs.

    Tu peux montrer ta classe de validation pour avoir une idée de ce que tu fais exactement ?

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 39
    Points : 34
    Points
    34
    Par défaut
    Pour l'instant ma classe ne fait pas grand chose.

    Mais je crois que je me suis mal fait comprendre (où j'ai mal compris les validation_groups, où les 2 )

    Il s'agit du même formulaire. Avec le même champs date.

    Selon que ça soit un utilisateur connecté ou un administrateur, alors on peut rentrer des valeur différentes.

    L'utilisateur connecté peut rentrer des dates sur une périodes donnée, l'admin n'a pas de limitation (du moment qu'il s'agit d'une date)

    Pour l'instant mon validateur contient ceci :

    <?php

    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
    <?php
     
    namespace XXX\YYYBundle\Validator\Constraints;
     
    use Symfony\Component\Validator\Constraint;
    use Symfony\Component\Validator\ConstraintValidator;
     
    class DateDebutValidator extends ConstraintValidator
    {
        public function isValid($value, Constraint $constraint)
        {
            var_dump($value);
            var_dump($constraint);
     
            if ($constraint->groups[0] == 'User') {
     
                return true;
     
            } else if ($constraint->groups[0] == 'Admin') {
     
                $this->setMessage($constraint->message, array('%string%' => $value));    
                return false;
     
            }
        }
    }
    ?>
    La logique de validation est absente pour l'instant.

    Mais comment dire au validateur, valide le champ date comme un utilisateur.

    Pour l'instant il renvoit faut à chaque fois

    J'ai également déclaré les groups dans mon formulaire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    <?php
    public function getDefaultOptions(array $options)
        {
            return array(
                         'data_class' => 'Pedagiciels\DemandeBundle\Entity\Demande',
                         'validation_groups' => array('Admin', 'User')
            );
        }
     
    ?>
    Le var_dump retourne ceci :

    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
     
    object(DateTime)[4508]
      public 'date' => string '2013-02-01 00:00:00' (length=19)
      public 'timezone_type' => int 3
      public 'timezone' => string 'Europe/Paris' (length=12)
     
    object(Pedagiciels\DemandeBundle\Validator\Constraints\DateDebut)[4108]
      public 'message' => string 'La date d'installation n'est pas valide.' (length=40)
      public 'groups' => 
        array
          0 => string 'Admin' (length=5)
          1 => string 'User' (length=4)
     
    object(DateTime)[4508]
      public 'date' => string '2013-02-01 00:00:00' (length=19)
      public 'timezone_type' => int 3
      public 'timezone' => string 'Europe/Paris' (length=12)
     
    object(Pedagiciels\DemandeBundle\Validator\Constraints\DateDebut)[4108]
      public 'message' => string 'La date d'installation n'est pas valide.' (length=40)
      public 'groups' => 
        array
          0 => string 'Admin' (length=5)
          1 => string 'User' (length=4)
    Apparemment le validateur est appelé 2 fois...

  6. #6
    Membre habitué
    Homme Profil pro
    Chef d'entreprise
    Inscrit en
    Mai 2011
    Messages
    122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chef d'entreprise
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mai 2011
    Messages : 122
    Points : 169
    Points
    169
    Par défaut
    Tu n'as besoin d'une validation que dans le cas d'un utilisateur avec le role USER, donc ne définis qu'un groupe 'User'.

    Ainsi, dans ta classe DateDebutValidator, tu n'auras que la logique de validation propre au ROLE_USER. Il te suffit alors d'ajouter l'annotation @MyAssert\DateDebut(groups="User")

    A toi ensuite de passer le bon argument à la méthode createFormBuilder en fonction du role de l'utilisateur.

  7. #7
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 39
    Points : 34
    Points
    34
    Par défaut
    Si je comprends bien, la disctinction selon les rôles n'est pas faîtes dans le validateur mais à la construction du formulaire.

    Je teste ça tout de suite.

  8. #8
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 39
    Points : 34
    Points
    34
    Par défaut
    Ca marche!

    Je n'ai pas encore développé la logique mais voici déjà le code:

    Le validateur :
    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
     
    <?php
     
    namespace XXX\YYYBundle\Validator\Constraints;
     
    use Symfony\Component\Validator\Constraint;
    use Symfony\Component\Validator\ConstraintValidator;
     
     
    class DateDebutValidator extends ConstraintValidator
    {
        public function isValid($value, Constraint $constraint)
        {
            $this->setMessage($constraint->message, array('%string%' => $value));    
            return false;
        }
    }
     
    ?>
    Le formulaire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    <?php
     public function getDefaultOptions(array $options)
        {
            return array(
                         'data_class' => 'Pedagiciels\DemandeBundle\Entity\Demande',
                         'validation_groups' => array('User', 'Default') //surtout ne pas oublier Default
            );
        }
     
    ?>
    L'entité :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    <?php
    ...
         * @PedagicielsAssert\DateDebut(groups={"User"})
         */
        protected $dateDebut;
    ?>
    L'appel dans le controller :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <?php
    $form = $this->createForm(new DemandeType(), $demande, array('validation_groups' => array('User')));
    ?>
    => affiche "La date est invalide". Normal le validator retourne false

    Deuxième appel

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <?php
    $form = $this->createForm(new DemandeType(), $demande, array('validation_groups' => array('Default')));
    ?>
    La demande est enregistrée sans problème.

    Voilà
    Merci beaucoup Francesco34.

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 22/06/2015, 22h24
  2. syntax des requêtes Sql selon les données à traiter
    Par pra3t0r dans le forum VB 6 et antérieur
    Réponses: 6
    Dernier message: 21/06/2011, 22h53
  3. Réponses: 5
    Dernier message: 01/10/2006, 13h48
  4. [PHP-JS] validation des données
    Par emma des bois dans le forum Langage
    Réponses: 6
    Dernier message: 10/02/2006, 15h28
  5. dbgrid AND validation des données
    Par samlerouge dans le forum Bases de données
    Réponses: 10
    Dernier message: 11/06/2004, 23h08

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