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

时间:2015-09-28 14:25:11

标签: forms symfony doctrine

我正在尝试验证一些数量值,以确保我没有保存它们,除非我们有分配给它的股票。

问题是我正在使用表单集合,这意味着如果我们要交付100个项目,并且用户在每个100个数量的调度表单上创建2行,那么验证将让这两个项目得到创建而不是我想要的,这是允许第一个被保存,但然后在第二行错误。

似乎在调用form->isValid()时触发了验证,但看起来应该可以在调用form->isValid()之前逐行处理,我似乎无法弄明白。

如果我无法逐行验证还有其他方法可以顺利处理这类问题吗?

1 个答案:

答案 0 :(得分:0)

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

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()
            ;
        }
    }

    ...
}

第二个,就是按照此处所述创建custom validation constraint。我不会在这里提供一个示例,因为它可能编码过多..但是,您应该注意到,如果您要验证,必须在父表单的默认选项中将cascade_validation选项设置为true具有自定义约束的集合项..