Bonjour,

J'ai un problème avec la validation des forms. isValid() renvoie toujours true et les asserts ne sont pas pris en compte.

J'utilise "Symfony\Component\Validator\Constraints". Ca fait des jours que je cherche je ne comprends vraiment pas ..

mon entité (je teste uniquement titre):

<?php

namespace App\Entity;

use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Validator\Constraints as Assert; 
/**
 * @ORM\Entity(repositoryClass="App\Repository\PostRepository")
 */
class Post
{
    /**
     * @ORM\Id()
     * @ORM\GeneratedValue()
     * @ORM\Column(type="integer")
     */
    private $id;

    /**
     * @ORM\Column(type="string", length=10, nullable=true)
    * @Assert\Length(min="5", max="10", minMessage="Le titre doit faire au moins {{ limit }} caractères.", maxMessage="Le titre doit faire au plus {{ limit }} caractères.")
     */    
    private $title;    

    /**
     * @ORM\Column(type="string", length=255, nullable=true)
     */
    private $image;

    /**
     * @ORM\ManyToOne(targetEntity="App\Entity\Category", inversedBy="post")
     */
    private $Category;

    /**
     * @ORM\Column(type="integer")
     */
    private $idPosteur;

    /**
     * @ORM\Column(type="string", length=500)
     */
    private $description;

    /**
     * @ORM\Column(type="string", length=255, nullable=true)
     */
    private $location;

    /**
     * @ORM\Column(type="integer", nullable=true)
     */
    private $price;

    /**
     * @ORM\Column(type="integer", nullable=true)
     */
    private $type;

    /**
     * @ORM\Column(type="datetime", nullable=true)
     */
    private $duration;

    /**
     * @ORM\Column(type="integer", nullable=true)
     */
    private $subCat;

    /**
     * @ORM\Column(type="string", length=255, nullable=true)
     */
    private $paiement;

    /**
     * @ORM\ManyToOne(targetEntity=User::class, inversedBy="posts")
     * @ORM\JoinColumn(nullable=false)
     */
    private $user;

    public function getId(): ?int
    {
        return $this->id;
    }

    public function getTitle(): ?string
    {
        return $this->title;
    }

    public function setTitle(?string $title): self
    {
        $this->title = $title;

        return $this;
    }

    public function getImage(): ?string
    {
        return $this->image;
    }

    public function setImage(?string $image): self
    {
        $this->image = $image;

        return $this;
    }

    public function getCategory(): ?Category
    {
        return $this->Category;
    }

    public function setCategory(?Category $Category): self
    {
        $this->Category = $Category;

        return $this;
    }

    public function getIdPosteur(): ?int
    {
        return $this->idPosteur;
    }

    public function setIdPosteur(int $idPosteur): self
    {
        $this->idPosteur = $idPosteur;

        return $this;
    }

    public function getDescription(): ?string
    {
        return $this->description;
    }

    public function setDescription(string $description): self
    {
        $this->description = $description;

        return $this;
    }

    public function getLocation(): ?string
    {
        return $this->location;
    }

    public function setLocation(?string $location): self
    {
        $this->location = $location;

        return $this;
    }

    public function getPrice(): ?int
    {
        return $this->price;
    }

    public function setPrice(?int $price): self
    {
        $this->price = $price;

        return $this;
    }

    public function getType(): ?int
    {
        return $this->type;
    }

    public function setType(?int $type): self
    {
        $this->type = $type;

        return $this;
    }

    public function getDuration(): ?\DateTimeInterface
    {
        return $this->duration;
    }

    public function setDuration(?\DateTimeInterface $duration): self
    {
        $this->duration = $duration;

        return $this;
    }

    public function getSubCat(): ?int
    {
        return $this->subCat;
    }

    public function setSubCat(?int $subCat): self
    {
        $this->subCat = $subCat;

        return $this;
    }

    public function getPaiement(): ?string
    {
        return $this->paiement;
    }

    public function setPaiement(?string $paiement): self
    {
        $this->paiement = $paiement;

        return $this;
    }

    public function getUser(): ?User
    {
        return $this->user;
    }

    public function setUser(?User $user): self
    {
        $this->user = $user;

        return $this;
    }
}

Merci d'avance pour votre aide, je bloque totalement,

Bonne journée

11 réponses


Uneo7
Réponse acceptée

Haha, j'en était sûr, c'était ça ou tu avais pas handle la request correctement, pour ça que je voulais voir ton controlleur ^^
Maintenant tu n'oubliera plus ;)

Pense bien à mettre en résolu.

Salut il faut voir dans un premier temps ton fichier de configuration "security.yaml" et aussi je pense que cette classe doit implémenter une méthode pour fonctionner . je mets à ta disposition mon code si cela peut t'aider et aussi revoir ton controller s'il est bien ne contient pas d'erreur.

<?php

namespace App\Entity;

use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Validator\Constraints as Assert;
use Symfony\Component\Security\Core\User\UserInterface;
use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity;

/**

  • @ORM\Entity(repositoryClass="App\Repository\UserRepository")
  • @UniqueEntity(
  • fields={"username"}, message="Le nom d'utilisateur que vous avez tapé est déjà utilisé !")
  • @UniqueEntity(
  • fields={"phone"}, message="Numéro de télephone déjà utilisé par une autre personne !")
    */
    class User implements UserInterface,\Serializable
    {
    /**

    • @ORM\Id()
    • @ORM\GeneratedValue()
    • @ORM\Column(type="integer")
      */
      private $id;

    /**

    • @ORM\Column(type="string", length=255)
    • @Assert\Length( min = 5, minMessage = "Nom d'utilisateur trop court...")
      */
      private $username;

    /**

    • @ORM\Column(type="string", length=255)
    • @Assert\Regex(
    • pattern="/[0-9]{10}/"
    • )
      */
      private $phone;

    /**

    • @ORM\Column(type="string", length=255)
    • @Assert\EqualTo(propertyPath = "confirm_password",
    • message="Les deux mots de passe ne concordent pas !" )
    • */
      private $password;

    /**

    • @Assert\Length(
    • min = 6,
    • max = 15,
    • maxMessage = "Votre mot de passe ne doit pas dépasser {{ limit }} caractères",
    • minMessage = "Votre mot de passe doit comporter au minimum {{ limit }} caractères")
    • @Assert\EqualTo(propertyPath = "password", message="Vous n'avez pas saisi le même mot de passe !" )
      */
      private $confirm_password;

    public function getId(): ?int
    {
    return $this->id;
    }

    public function getUsername(): ?string
    {
    return $this->username;
    }

    public function setUsername(string $username): self
    {
    $this->username = $username;

    return $this;

    }

    public function getPhone(): ?string
    {
    return $this->phone;
    }

    public function setPhone(string $phone): self
    {
    $this->phone = $phone;

    return $this;

    }

    public function getPassword(): ?string
    {
    return $this->password;
    }

    public function setPassword(string $password): self
    {
    $this->password = $password;

    return $this;

    }

    public function getConfirmPassword()
    {
    return $this->confirm_password;
    }

    public function setConfirmPassword($confirm_password)
    {
    $this->confirm_password = $confirm_password;

    return $this;

    }

    public function getRoles()
    {
    return ['ROLE_USER'];
    }

    public function eraseCredentials()
    {

    }

    public function getSalt()
    {

    }

    /**

    • String representation of object
    • @link https://php.net/manual/en/serializable.serialize.php
    • @return string the string representation of the object or null
    • @since 5.1.0
      */
      public function serialize()
      {
      return serialize([
      $this->id,
      $this->username,
      $this->password
      ]);
      }

    /**

    • Constructs the object
    • @link https://php.net/manual/en/serializable.unserialize.php
    • @param string $serialized <p>
    • The string representation of the object.
    • </p>
    • @return void
      */
      public function unserialize($serialized)
      {
      list(
      $this->id,
      $this->username,
      $this->password
      ) = unserialize($serialized, ['allowed_classes' => false]);
      }

}

antoine0
Auteur

Bonsoir et merci beaucoup de ton retour !

J'ai bien regardé ton code et je ne vois pas vraiment ce que j'ai pu oublier... J'ai silloné les forums, je pense que mon security est bon, le controleur je ne vois vraiment pas. C'est un vrai casse tête je ne vois pas à côté de quoi je passe !

Salut,

Je ne vois pas bien ce que le security.yaml viens faire dans l'histoire, il n'intervient que pour la gestion de l'authentification, à la limite s y'avais un is granted ok mais là je vois pas.

Je manque d'éléments pour te répondre correctement, en effet il faudrais que tu me montre le code de ton controlleur et celui de ton formulaire. Cela me permetterais d'avoir une meilleur vue de ton code et pourvoir te répondre j'espère avec plus de pertinence :)

antoine0
Auteur

Hello, Merci pour ta réponse,

Je crois avoir trouvé une piste (j'utilise form_widget pour afficher mes forms), je regarde ca demain, et si je trouve pas je t'enverrai plus d'éléments !

Merci pour ton temps !

Bonsoir,

form_widget ne pose pas trop de soucis selon moi du moment que ton formulaire est valide (côté HTML), je chercherais plutôt du côté du controlleur à ta place :). Après je peut me tromper, dit moi ce que tes tests donnent sur form_widget.

antoine0
Auteur

Si je dis pas de bétise, form_widget va m'afficher que la zone de texte, donc il est normal que je percoive aucun message d'erreur ?

Je reviens vers toi, si c'est pas ca j'ai vraiment aucune idée je mettrai mon controleur ici !

Tu parle de formulaire qui est tout le temps valide pas d'affichage d'erreur, je me suis basé là dessus pour ma réponse ;)

Après la partie affichage change pas grand grand chose, si ton formulaire est faux, label ou pas, ton isValid devrait pas matcher. Après oui tu aura pas de retours visuel avec form_widget.

antoine0
Auteur

Yes autant pour moi, je vais regarder tout ca demain !

Merci a toi !

antoine0
Auteur

Alors.... comment dire que j'avais juste oublié de mettre le isValid..

Désolé pour la perte de temps

Bonne journée

antoine0
Auteur

Yes de suite !!

Merci encore