0

我在 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”字段,消息显示在顶部

4

2 回答 2

0

atPath在这里似乎没用,因为您的 Constraint 是应用于字符串的 PropertyConstraint,并且字符串没有孩子。

但是,当属性约束引发违规时,违规将附加到具有属性名称的字段(如果存在)。因此,如果您的表单有一个dureeP字段,则错误将附加到该字段,否则它将位于表单的根目录。

于 2016-05-25T09:03:34.720 回答
0

好的,所以我发现了问题!

问题在于我的列名,其中包括一个“_”(下划线)。

我换了

@ORM\Column(name="duree_p", type="decimal", precision=3, scale=2)

经过

@ORM\Column(name="prevu", type="decimal", precision=3, scale=2)

它解决了这个问题。所以名称中没有下划线,我们就完成了!

我是怎么找到的?通过创建一个虚拟(基本)验证器测试并将其附加到我的另一个实体的某些字段。我看到它适用于所有领域,所以我比较了两个实体之间的差异,这是唯一的差异。

这是我用来排除故障的验证器:

class TestValidator extends ConstraintValidator
{

    protected $em;

    public function __construct(EntityManager $em)
    {
        $this->em = $em;
    }

    public function validate($value, Constraint $constraint)
    {

        dump($value);

        if(!preg_match('/^[0-9]+$/', $value, $matches)) {
            $this->context->buildViolation($constraint->message)
                ->setParameter('%string%', $value)
                ->addViolation();
        }

    }
}
于 2016-05-25T12:32:20.560 回答