Forms Symfony表单集合-我们是否可以逐行检查验证,而不是检查整个表单?

Forms Symfony表单集合-我们是否可以逐行检查验证,而不是检查整个表单?,forms,symfony,doctrine,Forms,Symfony,Doctrine,我试图验证一些数量值,以确保我不会保存它们,除非我们有库存分配给它 问题是我使用的是表单集合,这意味着如果我们要交付100个项目,并且用户在分派表单上创建了两行,每行数量为100个,那么验证将允许创建两个项目,而不是我想要的,即允许保存第一行,但在第二行出错 似乎在调用表单->isValid()时会触发验证,但似乎应该可以在调用表单->isValid()之前逐行处理,我似乎无法理解 如果我无法逐行验证是否有其他方法可以顺利处理此类问题?要知道,我在这里看到两个选项:第一个是使用特殊常量来验证表单

我试图验证一些数量值,以确保我不会保存它们,除非我们有库存分配给它

问题是我使用的是表单集合,这意味着如果我们要交付100个项目,并且用户在分派表单上创建了两行,每行数量为100个,那么验证将允许创建两个项目,而不是我想要的,即允许保存第一行,但在第二行出错

似乎在调用
表单->isValid()
时会触发验证,但似乎应该可以在调用
表单->isValid()
之前逐行处理,我似乎无法理解


如果我无法逐行验证是否有其他方法可以顺利处理此类问题?

要知道,我在这里看到两个选项:第一个是使用特殊常量来验证表单值,下面是一个示例:

class MyEntityType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        ....
    }

    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver
            ->setDefaults([
                'data_class' => 'AcmeDemoBundle:MyEntity',
                'constraints' => [
                    new Callback(
                        ['callback' => [$this, 'validateForm']]
                    )
                ]
            ]);
    }

    public function validateForm(MyEntity $data, ExecutionContextInterface $context)
    {
        // Some validation logic here
        // e.g.:
        if ($data->getSomeData() < 4) {
            $context
                ->buildViolation('ERROR MESSAGE HERE.')
                ->atPath('someData')
                ->addViolation()
            ;
        }
    }

    ...
}
类MyEntityType扩展了AbstractType
{
公共函数buildForm(FormBuilderInterface$builder、array$options)
{
....
}
公共函数配置选项(选项解析器$resolver)
{
$resolver
->设置默认值([
“数据类”=>“AcmeDemoBundle:MyEntity”,
'约束'=>[
新回调(
['callback'=>[$this'validateForm']]
)
]
]);
}
公共函数validateForm(MyEntity$data,ExecutionContextInterface$context)
{
//这里有一些验证逻辑
//例如:
如果($data->getSomeData()<4){
$context
->buildViolation('此处有错误消息')
->atPath('someData')
->addViolation()
;
}
}
...
}

第二个是按此处所述创建。这里我不提供示例,因为它可能需要太多的编码。。但是,您应该注意,如果要使用自定义约束验证集合项,则必须在父窗体的默认选项中将
cascade\u validation
选项设置为
true

是否尝试使用$form->get($fieldname)->isValid()?我没有想到马里诺,但我刚刚尝试过这个,在我的情况下似乎不起作用。谢谢你的主意。谢谢这个xurshid,我以前没见过这个方法。我花了一些时间来实现它,它似乎并没有改变我的设置,所以我必须假设这个问题是在教义本身。