【问题标题】:Entity (with constraints) + createFormBuilder (with extra fields) fail实体(带约束)+ createFormBuilder(带额外字段)失败
【发布时间】:2020-05-12 07:29:01
【问题描述】:

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

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_PASSWORD\NEW_PASSWORD 属性)。如果我不设置“数据类”,表单显然不会继承任何约束(如密码@Assert\Length(min=6) 约束)

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

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

有什么提示吗?

【问题讨论】:

  • 将数据类设置为用户实体,但将旧密码和新密码作为未映射字段处理。在您的控制器中使用数据库检查旧密码,并验证新密码。如果验证成功,则对普通密码进行编码,并使用编码密码和 flush() 设置实体密码属性;
  • 像这样获取未映射的表单域 (['mapped' => false]):$new_password = $form->get('new_password')->getData();
  • 谢谢大家,完全忘记了“未映射”>。

标签: forms symfony constraints entity


【解决方案1】:

将您的表单更改为:

$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.
    }
}

【讨论】:

  • 谢谢,我完全忘记了未映射的字段,tyty
猜你喜欢
  • 2021-10-21
  • 2017-04-27
  • 2013-05-29
  • 1970-01-01
  • 2018-09-17
  • 2022-06-20
  • 1970-01-01
  • 2013-03-04
  • 2016-08-17
相关资源
最近更新 更多