我在 Symfony 2 中构建了一个自定义约束验证,它调用了 Doctrine :
if($prevu != 0) {
$total = $prevu + $consomme;
if($total > $charge) {
$this->context->buildViolation($constraint->message1)
->setParameter('%string%', $prevu)
->atPath('intervention.dureeP')
->addViolation();
}
dump($this);
}elseif($realise != 0) {
$total = $realise + $consomme;
if($total > $charge) {
$this->context->buildViolation($constraint->message2)
->setParameter('%string%', $realise)
->atPath('dureeR')
->addViolation();
}
}
我的问题是错误不会显示在字段旁边,而是显示在表单的顶部。
我用这样的注释调用我的自定义验证器:
/**
* @var string
*
* @ORM\Column(name="duree_p", type="decimal", precision=3, scale=2, nullable=true)
* @MyAssert\ExceedCharge
*/
private $dureeP;
奇怪的是,在某些字段中,它会在旁边显示错误,但对于其他字段,它会在顶部显示错误。
我在 StackOverflow 上看到过这篇文章:自定义约束验证错误不会显示在 Symfony2 中的字段旁边,但它对我没有帮助。
我尝试了“atPath()”选项但没有成功。
我不明白的是它适用于某些领域,而不适用于我想要的领域......
有人有任何线索吗?
编辑 :
我还注意到,当违规消息发生时,与违规消息相关的字段没有任何 'has-error' 类,因此没有“。
编辑 2:
这是我的约束逻辑:
class ExceedChargeValidator extends ConstraintValidator
{
protected $em;
public function __construct(EntityManager $em)
{
$this->em = $em;
}
public function validate($value, Constraint $constraint)
{
dump($value); //DEBUG
dump($this->context); //DEBUG
//get id to perform search
$id = $this->context->getObject()->getCast()->getId();
$consomme = $this->em->getRepository('AppBundle:Intervention')->getConsomme($id);
$charge = $this->context->getObject()->getCast()->getCharge();
$prevu = $this->context->getObject()->getDureeP();
$realise = $this->context->getObject()->getDureeR();
dump($prevu); //DEBUG
dump($realise); //DEBUG
if($value != 0) {
$total = $value + $consomme;
if($total > $charge) {
$this->context->buildViolation($constraint->message1)
->setParameter('%string%', $value)
->addViolation();
dump($this->context->getPropertyPath());
}
dump($this); //DEBUG
}
dump($consomme);//DEBUG
dump($charge); //DEBUG
}
}
以下是我的 Entity 的一些字段:
/**
* @var \DateTime
*
* @ORM\Column(name="date", type="date")
*/
private $date;
/**
* @var string
*
* @ORM\Column(name="duree_p", type="decimal", precision=3, scale=2, nullable=true)
* @MyAssert\ExceedCharge
*/
private $dureeP;
/**
* @var string
*
* @ORM\Column(name="duree_r", type="decimal", precision=3, scale=2, nullable=true)
* @Assert\GreaterThan(
* value = 0
*)
*/
private $dureeR;
表格由 Easy Admin bundle 生成
如果我将相同的约束违规附加到不同的字段,这就是我得到的结果。我们可以看到它在我的“日期”字段上运行良好,但对于“dureeP”字段,消息显示在顶部