Exemple de validator custom avec une validation de l’âge sur des dates de naissance :
MonBundle/Validator/Majeur.php
namespace Maboite\MonBundle\Validator;
use Symfony\Component\Validator\Constraint;
/**
* @Annotation
*/
class Majeur extends Constraint
{
public $message = 'Vous devez être majeur-e pour jouer.'; //<- le message par défaut
}
use Symfony\Component\Validator\Constraint;
/**
* @Annotation
*/
class Majeur extends Constraint
{
public $message = 'Vous devez être majeur-e pour jouer.'; //<- le message par défaut
}
MonBundle/Validator/MajeurValidator.php
namespace Maboite\MonBundle\Validator;
use Symfony\Component\Validator\Constraint;
use Symfony\Component\Validator\ConstraintValidator;
class MajeurValidator extends ConstraintValidator
{
public function isValid($value, Constraint $constraint)
{
$now=new \DateTime("now");
$diff=$value->diff($now);
// ( le test sur l'année ne suffit pas car diff renvoie une "vraie" différence tenant compte des années bisextiles )
if ($diff->y == 18) {
if ($diff->m > 1) return true;
if (intval($now->format('j')) >= intval($value->format('j'))) return true;
} else {
if ($diff->y > 18) {
return true;
}
}
$this->setMessage($constraint->message);
return false;
}
}
use Symfony\Component\Validator\Constraint;
use Symfony\Component\Validator\ConstraintValidator;
class MajeurValidator extends ConstraintValidator
{
public function isValid($value, Constraint $constraint)
{
$now=new \DateTime("now");
$diff=$value->diff($now);
// ( le test sur l'année ne suffit pas car diff renvoie une "vraie" différence tenant compte des années bisextiles )
if ($diff->y == 18) {
if ($diff->m > 1) return true;
if (intval($now->format('j')) >= intval($value->format('j'))) return true;
} else {
if ($diff->y > 18) {
return true;
}
}
$this->setMessage($constraint->message);
return false;
}
}
Dans l’entité concernée on peut utiliser la validation :
MonBundle/Entity/User.php
....
use Symfony\Component\Validator\Constraints as Assert;
use Symfony\Bridge\Doctrine\Validator\Constraints as DoctrineAssert;
use Maboite\MonBundle\Validator\Majeur as Majeur;
....
/**
* @var date $datenaissance
*
* @ORM\Column( type="date")
* @Assert\NotBlank(message="Veuillez saisir votre date de naissance.")
* @Majeur(message="Vous devez être majeur-e pour jouer.")
*/
private $datenaissance;
use Symfony\Component\Validator\Constraints as Assert;
use Symfony\Bridge\Doctrine\Validator\Constraints as DoctrineAssert;
use Maboite\MonBundle\Validator\Majeur as Majeur;
....
/**
* @var date $datenaissance
*
* @ORM\Column( type="date")
* @Assert\NotBlank(message="Veuillez saisir votre date de naissance.")
* @Majeur(message="Vous devez être majeur-e pour jouer.")
*/
private $datenaissance;
voilà maintenant la contrainte fonctionnera comme les contraintes prédéfinies lors de vos appels à $form->isValid()