Symfony 5 中子表单的验证组
Validation Groups for Subforms in Symfony 5
应用到子表单的验证组似乎被父表单中的验证忽略了。
我的子表单:
密码更新
Pass1 -> NotBlank ['groups'->'password_update']
通行证 2
对于子表单,这是配置选项:
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults([
'data_class' => User::class,
'cascade_validation' => true,
'error_bubbling' => false,
'validation_groups' => function(FormInterface $form){
$validation_group = [];
if ($form->get('password_update')->getData()){
$validation_group = ['Default', 'password_update'];
}else{
$validation_group = ['Default'];
}
return $validation_group;
}
]);
}
主窗体
姓名
子窗体
对于 Mainform,这是配置选项:
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults([
'data_class' => Profesor::class,
'cascade_validation' => true,
'validation_groups' => false,
]);
}
即使 validation_groups 设置为 FALSE,表单也会在子表单中抛出错误。
如何将验证组应用于子表单?
在父表单的 buildForm
方法中,您将选项转发给子表单,如下所示:
->add('subForm', SubformType::class, [
'validation_groups' => $options['validation_groups'],
// your other options
])
表单组件 "framework" 默认转发选项实际上是不可取的,因为它可能会产生意想不到的后果,因此显式转发选项是可行的方法(想象一个无意的邪恶反例不会真的很难,我想)。
应用到子表单的验证组似乎被父表单中的验证忽略了。
我的子表单: 密码更新 Pass1 -> NotBlank ['groups'->'password_update'] 通行证 2
对于子表单,这是配置选项:
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults([
'data_class' => User::class,
'cascade_validation' => true,
'error_bubbling' => false,
'validation_groups' => function(FormInterface $form){
$validation_group = [];
if ($form->get('password_update')->getData()){
$validation_group = ['Default', 'password_update'];
}else{
$validation_group = ['Default'];
}
return $validation_group;
}
]);
}
主窗体
姓名 子窗体
对于 Mainform,这是配置选项:
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults([
'data_class' => Profesor::class,
'cascade_validation' => true,
'validation_groups' => false,
]);
}
即使 validation_groups 设置为 FALSE,表单也会在子表单中抛出错误。
如何将验证组应用于子表单?
在父表单的 buildForm
方法中,您将选项转发给子表单,如下所示:
->add('subForm', SubformType::class, [
'validation_groups' => $options['validation_groups'],
// your other options
])
表单组件 "framework" 默认转发选项实际上是不可取的,因为它可能会产生意想不到的后果,因此显式转发选项是可行的方法(想象一个无意的邪恶反例不会真的很难,我想)。