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();
}
}
}
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).
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
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.
× 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.
Keep It Simple Stupid - SF4 conf Swift - Cours 1/4 SF4 - Exceptions PDO - Formes Normales
Keep It Simple Stupid - SF4 conf Swift - Cours 1/4 SF4 - Exceptions PDO - Formes Normales
Keep It Simple Stupid - SF4 conf Swift - Cours 1/4 SF4 - Exceptions PDO - Formes Normales