我正在尝试验证一些数量值,以确保我没有保存它们,除非我们有分配给它的股票。
问题是我正在使用表单集合,这意味着如果我们要交付100个项目,并且用户在每个100个数量的调度表单上创建2行,那么验证将让这两个项目得到创建而不是我想要的,这是允许第一个被保存,但然后在第二行错误。
似乎在调用form->isValid()
时触发了验证,但看起来应该可以在调用form->isValid()
之前逐行处理,我似乎无法弄明白。
如果我无法逐行验证还有其他方法可以顺利处理这类问题吗?
答案 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
具有自定义约束的集合项..