Bonjour,

J'essaie de créer une contrainte de validation personnalisée mais je rencontre beaucoup de difficultés.
Tout part de cette classe :
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
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
namespace App\Entity;
 
use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Validator\Constraints as Assert;
use Validateur\Contrainte\ProgrammeDuree;
 
/**
 * @ORM\Entity(repositoryClass="App\Repository\ProgrammeRepository")
 */
class Programme
{
    /**
     * @ORM\Id()
     * @ORM\GeneratedValue()
     * @ORM\Column(type="integer")
     */
    private $id;
 
    /**
     * @ORM\Column(type="datetime")
     */
    private $datedebut;
 
    /**
     * @ORM\Column(type="datetime")
     * @ProgrammeDuree(message="Mauvaise période")
    */
    private $datefin;
 
public function getId(): ?int
    {
        return $this->id;
    }
 
    public function getDatedebut(): ?\DateTimeInterface
    {
        return $this->datedebut;
    }
 
    public function setDatedebut(\DateTimeInterface $datedebut): self
    {
        $this->datedebut = $datedebut;
 
        return $this;
    }
 
    public function getDatefin(): ?\DateTimeInterface
    {
        return $this->datefin;
    }
 
    public function setDatefin(\DateTimeInterface $datefin): self
    {
        $this->datefin = $datefin;
 
        return $this;
    }
 
}
Mon objectif est de créer une contrainte de validation qui vérifie qu'entre DateFin et DateDebut, il y a exactement 30 jours.

Pour cela, dans le dossier src de mon projet j'ai créé le dossier Validateur et ensuite Contrainte comme sous dossier de Validateur.
Puis :
Constraint Class

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
 
<?php
namespace Validateur\Constrainte;
 
use Symfony\Component\Validator\Constraint;
 
 
/**
*@Annotation
*/
class ProgrammeDuree extends Constraint
{
    public $message = 'La durée n\'excède pas trente (30) jours';
 
 
    /**
     * Get class constraints and properties
     * 
     * @return array
     */
    public function getTargets()
    {
        return array(self::CLASS_CONSTRAINT, self::PROPERTY_CONSTRAINT);
    }    
}
Ensuite :
Validator Class
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
<?php
namespace App\Validateur\Contrainte;
 
use Symfony\Component\Validator\Constraint;
use Symfony\Component\Validator\ConstraintValidator;
 
class ProgrammeDureeValidator extends ConstraintValidator
{
    public function validate($value, Constraint $constraint)
    {
        $date1 = $this->context->getRoot->get('datedebut')->getData();
        $date2 = $this->context->getRoot->get('datefin')->getData();
        if (($date1->diff($date2)) != 30 ) {
            $this->context->addViolation (
                $constraint->message,
                array('%string%' => $value)
            );            
            return false;            
        }
 
        return true;
 
    }
}
 
?>
A l'exécution j'ai le message d'erreur suivant :
[Semantical Error] The annotation "@Validateur\Contrainte\ProgrammeDuree" in property App\Entity\Programme::$datefin does not exist, or could not be auto-loaded.
Je demande votre concours pour débloquer la situation s'il vous plait.