我已经为我的项目实施了密码重置页面。它工作正常,但我尝试使用最佳实践和可重用代码。所以这就是问题所在。 我有一个用于密码重置表单的FormType和一个重置控制器。 我知道验证通常意味着将表单类型的字段映射到类的对象,并对该对象的属性具有验证规则。 但是对于密码重置,我认为需要使用“非映射”字段。现在,我提交表单并获取ResettingController中的值。我自己检查是否存在具有电子邮件,生日和安全答案的用户。这是有效的,但我认为没有以正确的方式实施。 是否可以向整个ResetFormType添加自定义约束,并且在提交表单时,它应该调用约束来检查用户是否存在。所以我想使用Symfony验证系统,而不是我在控制器中写的“if,else,if ......”。
这是我的代码:
ResetPwFormType:
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('username', null, array(
'label' => 'resetting.request.username',
'translation_domain' => 'FOSUserBundle',
'mapped' => false
))
->add('birthday', 'date', array(
'years' => range(date('Y') - 74, date('Y') - 18),
'label' => 'register.user.contact.birthdayBlank',
'translation_domain' => 'Startup',
'mapped' => false
))
->add('plainSecurityAnswer', 'text', array(
'label' => 'register.user.security.answer',
'translation_domain' => 'Startup',
'mapped' => false
));
}
ResettingController:
$form = $this->container->get('form.factory')->create(new ResetPwFormType());
$form->handleRequest($this->container->get('request'));
$username = $form->get('username')->getData();
$birthday = $form->get('birthday')->getData();
$securityAnswer = $form->get('plainSecurityAnswer')->getData();
/** @var $user UserInterface */
$user = $this->container->get('doctrine')->getRepository('UserBundle:User')->findUserForPasswordReset($username, $birthday, $securityAnswer);
$jsonReturn = array();
if($user !== null)
{
// etc.
}
我想在这里使用“$ form-> isValid()”方法,而不是将表单的每个字段保存在变量中,将其传递给存储库方法并检查用户是否手动存在。为此,我认为需要对整个表格进行约束..?
更新:我认为我需要一个模型类用于重置过程,对于整个类,我可以添加自定义验证约束。
问候。
答案 0 :(得分:0)
您可以使用'约束'表单构建器中的选项:
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('username', null, array(
'label' => 'resetting.request.username',
'translation_domain' => 'FOSUserBundle',
'mapped' => false,
'constraints' => [
new YourCustomConstraint()
]
));
}
答案 1 :(得分:-1)
我现在实施了一个"模型"重置表单类型的类。在那里我可以为属性添加约束(用户名,生日,securityAnswer),然后另外向类本身添加约束。