Partage
  • Partager sur Facebook
  • Partager sur Twitter

Symfony 4 : Problème de validation

InvalidArgumentException

    20 novembre 2019 à 10:30:08

    Bonjour,

    J'ai un probème de validation de données sous Symfony.

    Sur mon formulaire, je souhaiterais afficher une erreur en dessous du champ lorsque celui-ci est rempli avec une valeur invalide, et n'accepter que les entiers nuls où positifs.

    Ma méthode du Controller:

        /**
         * @Route("/donation/newForm", name="newDonation", methods={"GET", "POST"})
         */
        public function create(Request $request, ObjectManager $manager, StockUpdateService $stockUpdate)
        {
            $donation = new Donation();
            $form = $this->createForm(AddDonationType::class, $donation);
    
            $form->handleRequest($request);
    
            if ($form->isSubmitted() && $form->isValid()) {
    
                // Do something
    
                $manager->persist($donation);
                $manager->flush();
    
                return $this->redirectToRoute('donation', ['id' => $donation->getId()]);
            }
    
            return $this->render('/donation/donationFormCreate.html.twig', [
                'form' => $form->createView(),
            ]);
        }


    ConstraintType.php

    <?php
    
    namespace App\Validator\Constraints;
    
    
    use Symfony\Component\Validator\Constraint;
    
    class ConstraintType extends Constraint
    {
    
        public $valueOrTypeError = 'La valeur du champ "{{ field }}" est invalide.';
    
        public function validatedBy()
        {
            return \get_class($this).'Validator';
        }
    
        public function getTargets()
        {
            return self::CLASS_CONSTRAINT;
        }
    }

    ConstraintTypeValidator.php

    <?php
    
    namespace App\Validator\Constraints;
    
    
    use Symfony\Component\Validator\Constraint;
    use Symfony\Component\Validator\ConstraintValidator;
    
    
    class ConstraintTypeValidator extends ConstraintValidator
    {
    
        public function validate($entity, Constraint $constraint)
        {
            if ($entity->getWeight() <= 0 || !is_int($entity->getWeight())) {
                $this->context->buildViolation($constraint->valueOrTypeError)
                    ->setParameter('{{ field }}', 'Poids')
                    ->atPath('weight')
                    ->addViolation();
            }
        }
    }

    validation.yaml :

    App\Entity\Donation:
        constraints:
            - App\Validator\Constraints\ConstraintType: ~

    Le champ de mon formulaire :

                ->add('weight', TextType::class, [
                    'label' => 'Poids',
                    'required' => true,
                ])

    Twig :

                    <div class="display-infos-group">
                        <div class="display-infos-name">Poids(Kg)</div>
                        <div class="display-infos-value">{{ form_widget(form.weight) }}
                           <span class="error">{{ form_errors(form.weight) }}</span></div>
    
                    </div>


    Mon problème : Lorsque je rentre un nombre négatif, tout va bien, je récupère bien mon erreur qui s'affiche en dessous de mon champ.

    Mais lorsque je rentre un string, je me frappe une belle erreur 500 :

    Expected argument of type "integer", "string" given at property path "weight".


    Cela semble venir du fait que le handleRequest interviens avant la validation. Donc, si le type n'est pas bon (j'ai un type="integer" dans la propriété de mon entité) , cela ne passe meme pas par le validateur.

    Je précise que j'ai le même problème si je met ma contrainte directement dans le champs du formulaire , ou même directement dans validation.yaml (comme suggéré dans la doc).

    A l'aide, je sèche completement :(

    -
    Edité par Romain84- 20 novembre 2019 à 10:32:14

    • Partager sur Facebook
    • Partager sur Twitter
      20 novembre 2019 à 11:33:11

      Salut,

      où est ton fichier Donation.php c'est dans les commentaire qu'il faut mettre les contraintes

      un exemple sur la longueur du password chez moi:

      <?php
      /**
           * @ORM\Column(type="string", length=255)
           * @Assert\Length(min=8, minMessage="Le mot de passe doit faire 8 caracteres minimum")
           */
          private $password;

      Assert == alias sur Constraints

      -
      Edité par christouphe 20 novembre 2019 à 11:36:41

      • Partager sur Facebook
      • Partager sur Twitter
        20 novembre 2019 à 12:14:50

        Merci pour ta réponse.

        Oui, c'est vrai, [s]il faut[/s] on peut également le faire via les Annotations.

        Sauf que dans mon cas, cela ne change rien.

        Si je fais un :

            /**
             * @ORM\Column(type="integer", nullable=true)
             * @Assert\Type(type="integer", message="Merci de renseigner une valeur numérique")
             */
            private $weight;

        Même problème, même erreur 500.

        En revanche, un :

            /**
             * @ORM\Column(type="integer", nullable=true)
             * @Assert\Positive(message="Merci de renseigner une valeur positive")
             */
            private $weight;

        Fonctionne parfaitement.

        Encore une fois, le problème ne semble pas venir de l'endroit ou je valide mes données, mais lorsque je cherche a en valider le type ;).

        • Partager sur Facebook
        • Partager sur Twitter
          20 novembre 2019 à 12:22:14

          J'ai remarqué qu'avec SF, il faut vraiment se tenir aux cours et doc, il fait beaucoup de choses pour nous.

          Si le problème est résolu, tu sais ce qu'il faut faire ;)

          • Partager sur Facebook
          • Partager sur Twitter
            20 novembre 2019 à 12:33:32

            christouphe a écrit:

            J'ai remarqué qu'avec SF, il faut vraiment se tenir aux cours et doc, il fait beaucoup de choses pour nous.

            Si le problème est résolu, tu sais ce qu'il faut faire ;)


            Le problème n'est pas du tout résolu...

            Et ce que j'ai fait suit parfaitement la doc, renseigne toi sur les Custom Validation Constraint.

            • Partager sur Facebook
            • Partager sur Twitter
              20 novembre 2019 à 12:46:12

              ok

              mais comme tu disais que l'assert avec valeur positive était OK et que c'est un poids => toujours positif pour moi tout était bon ;)

              -
              Edité par christouphe 20 novembre 2019 à 12:48:18

              • Partager sur Facebook
              • Partager sur Twitter
                20 novembre 2019 à 12:54:02

                Salut !

                Pourquoi utiliser un TextType pour le champ ? Il va effectivement te renvoyer une chaîne de caractères, là où un NumberType te retournerait bien un nombre, voire un entier s'il est correctement paramétré, et il y a même un paramètre pour afficher un input text plutôt que number… Que demande le peuple ?

                Sinon, tu peux te créer ton DataTransformer pour effectuer la conversion.

                • Partager sur Facebook
                • Partager sur Twitter

                Symfony 4 : Problème de validation

                × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                • Editeur
                • Markdown