Forms 实体(带约束)+createFormBuilder(带额外字段)失败

Forms 实体(带约束)+createFormBuilder(带额外字段)失败,forms,symfony,constraints,entity,Forms,Symfony,Constraints,Entity,我的用户实体有几个属性: private $id; /** Assert\Email */ private $email; /** * @Assert\Length( min=6, minMessage="Password is too short (min 6 symbols)" ) */ private $password; 我正在尝试创建用于更改密码的表单: createFormBuilder(null, ??? data-class=UserEntity ??? ) ->ad

我的用户实体有几个属性:

private $id;
/**
Assert\Email
*/
private $email;
/**
 * @Assert\Length( min=6, minMessage="Password is too short (min 6 symbols)" )
 */
private $password;
我正在尝试创建用于更改密码的表单:

createFormBuilder(null, ??? data-class=UserEntity ??? )
->add('YES_CHANGE_PASS',CheckboxType::class,['required'=>false])
->add('old_password',PasswordType::class,['required'=>false])
->add('new_password', RepeatedType::class,['required'=>false])
问题:如果我将“data class=UserEntity::class”设置为此表单,它当然会停止工作,因为我的实体没有OLD\u PASSWORD\NEW\u PASSWORD属性。如果我不设置“数据类”,表单显然不会继承任何约束,如password@Assert\Lengthmin=6约束

解决方案1我不喜欢:在createFormBuilder函数中对所有需要的约束进行硬编码。我不喜欢这种方式,因为如果有一天我想更改密码minLength,我将不得不在整个项目中搜索这样的表单来编辑它

解决方案2疯狂:将所有额外字段添加到我的实体中,这样我就可以使用“数据类:UserEntity”。。。和约束…和验证。。。但这显然是一个病态的解决方案


有什么提示吗?

请将您的表格更改为:

$form=$this->createFormBuilder()
     ->add('YES_CHANGE_PASS', CheckboxType::class, array(
         'mapped'=>false,
         'required'=>false,
     ))
     ->add('old_password', PasswordType::class, array(
         'mapped'=>false,
         'required'=>false,
     ))
     ->add('new_password', RepeatedType::class, array(
         'mapped'=>false,
         'required'=>false,
     ));
然后,在提交表格时:

if($form->get('YES_CHANGE_PASS')->getData()) { // <== Used asked to change password?
    if($passwordEncoder->isPasswordValid($this->getUser(), $form->get('YES_CHANGE_PASS')->getData())) { // <== Check if old password is valid
        $form->get('new_password')->getData(); // <== Do what you need with the new password.
    }
}

将数据类设置为用户实体,但将旧密码和新密码作为未映射字段处理。在控制器中,使用数据库检查旧密码,并验证新密码。如果验证成功,则对普通密码进行编码,并使用编码密码和刷新设置实体密码属性;获取未映射的formfield['mapped'=>false]如下:$new\u password=$form->Get'new\u password'->getData;谢谢,伙计们,完全忘记了“未映射”>。谢谢,我完全忘记了未映射的字段,泰蒂