我有一些复杂的表单,有几个子表单,我希望能够根据在主表单中选择的单选按钮分别验证每个子表单。我想通过验证小组来实现这一点。
注意:我没有data_class
模型,我使用数组。
以下是我的简化表单:
class MyType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder->add('xxx', 'text', array(
'constraints' => array(
new Constraints\NotBlank(),
),
'validation_groups' => array(
'xxx',
)
))
;
}
public function setDefaultOptions(OptionsResolverInterface $resolver)
{
$resolver->setDefaults(array(
'validation_groups' => function(FormInterface $form) {
return array('xxx');
},
));
}
}
问题是没有触发对此字段的验证。
当这起作用时,我可以很容易地更改setDefaultOptions
以根据提交的数据验证所需的组:
public function setDefaultOptions(OptionsResolverInterface $resolver)
{
$resolver->setDefaults(array(
'validation_groups' => function(FormInterface $form) {
$data = $form->getData();
return array($data['type']);
},
));
}
有什么想法吗?
发布于 2012-11-02 17:28:49
您必须将验证组名称传递给约束,而不是在表单本身中。通过将组名分配给表单,可以指定要在验证中使用的约束。
替换
$builder->add('xxx', 'text', array(
'constraints' => array(
new Constraints\NotBlank(),
),
'validation_groups' => array(
'xxx',
)
))
;
使用
$builder->add('xxx', 'text', array(
'constraints' => array(
new Constraints\NotBlank(array(
'groups' => 'xxx'
)),
),
))
;
默认情况下,约束具有“default”(大写)组,如果未指定,表单将使用此组进行验证。如果您希望验证其他没有显式组的约束,则与指定的组一起传递“默认”约束。
$resolver->setDefaults(array(
'validation_groups' => function(FormInterface $form) {
$data = $form->getData();
return array($data['type'], 'Default');
},
));
https://stackoverflow.com/questions/13123900
复制