如何将模型字段绑定到RepeatedType表单密码字段?
解决RepeatedType表单与模型双密码字段绑定问题
针对你的场景,有两种简洁的方式实现表单字段与模型中password、passwordRepeat两个字段的绑定:
方法一:通过配置字段名称自动映射
修改表单中RepeatedType的配置,指定first_name和second_name对应模型的两个字段,同时开启自动映射:
use Symfony\Component\Form\Extension\Core\Type\PasswordType; use Symfony\Component\Form\Extension\Core\Type\RepeatedType; // ... $builder->add('passwordPair', RepeatedType::class, [ // 指定密码输入框的类型为PasswordType(隐藏输入内容) 'type' => PasswordType::class, // 第一个输入框对应模型的password字段 'first_name' => 'password', // 第二个输入框对应模型的passwordRepeat字段 'second_name' => 'passwordRepeat', 'first_options' => ['label' => 'Password'], 'second_options' => ['label' => 'Repeat password'], 'invalid_message' => 'The password fields must match.', // 开启自动映射到模型字段 'mapped' => true, ]);
这样表单会自动将两个输入框的值分别赋值给模型的password和passwordRepeat属性,同时RepeatedType自带的密码匹配验证会正常生效。
方法二:手动赋值(适合需要额外处理的场景)
如果需要在赋值前做额外逻辑,可以将表单字段设置为非映射,提交后手动提取值并赋值给模型:
表单定义
$builder->add('password', RepeatedType::class, [ 'type' => PasswordType::class, 'first_options' => ['label' => 'Password'], 'second_options' => ['label' => 'Repeat password'], 'invalid_message' => 'The password fields must match.', // 设置为非映射,不自动关联模型字段 'mapped' => false, ]);
控制器处理提交
if ($form->isSubmitted() && $form->isValid()) { $user = $form->getData(); // 提取RepeatedType的两个输入值 $passwordInputs = $form->get('password')->getData(); $user->password = $passwordInputs['first']; $user->passwordRepeat = $passwordInputs['second']; // 执行后续的保存或业务逻辑 }
两种方法都能实现需求,推荐第一种自动映射的方式,代码更简洁且符合Symfony表单的设计规范。
内容的提问来源于stack exchange,提问作者Tomasz Filipek
相关产品推荐
相关产品推荐

