【发布时间】: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