Forms 约束\回调注释验证上一个(未提交)实体

Forms 约束\回调注释验证上一个(未提交)实体,forms,validation,symfony,Forms,Validation,Symfony,我正在使用验证一个实体 /** * @ORM\Entity(repositoryClass="AppBundle\Repository\Foo") * @ORM\Table(name="foo") * @Constraints\Callback(methods={"validate"}) */ class Foo { ... function validate(ExecutionContextInterface $context) { if ($

我正在使用验证一个实体

/**
 * @ORM\Entity(repositoryClass="AppBundle\Repository\Foo")
 * @ORM\Table(name="foo")
 * @Constraints\Callback(methods={"validate"})
 */
class Foo
{
    ...

    function validate(ExecutionContextInterface $context)
    {
        if ($this->foos) {
            $context->buildViolation('Foos cannot be emty')
                ->atPath('foos')
                ->addViolation();
    }
}
表单正在使用此实体:

class FooFormType extends AbstractType
{
    private $foosService;

    function __construct(FoosService $foosService) {
        $this->foosService = $foosService;
    }
    /**
     * @param FormBuilderInterface $builder
     * @param array $options
     */
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('foos', EntityType::class, array(
                'label' => false,
                'class' => 'AppBundle:Entity\Foo',
                'choices' => $this->foosService->getSomeFoos($builder->getData()),
                'expanded' => true,
                'multiple' => true,
                'required' => true,
            ))
            ->getForm();
    }

    /**
     * @param OptionsResolver $resolver
     */
    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults(array(
            'data_class' => 'AppBundle\Entity\Foo',
        ));
    }
}
此表格在工厂内称为:

public function getFooForm(Foo $foo)
{
    return $this->formFactory->create(new FooFormType($this->foosService), $foo);
}
最后,在控制器中:

...

$form = $this->get('my_factory')->getFooForm($foo);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
    $this->getDoctrine()->getManager()->flush();
    ...
}

...
这似乎工作正常,但验证是在前一个实体上进行的。我的意思是,如果我提交空的
foos
,我可以看到验证错误,但是如果我使用了一些
foos
,然后删除这些
foos
,然后再次提交,验证不会引发任何异常,因为它是在上一个实体上进行的,该实体有一些
foos
。我已经检查了提交的数据是否正确,并且确实,
Foo
实体被保留为空的
foos
(只有在前一个实体有
foos
时)

是什么导致了这种奇怪的行为