Symfony自定义“重置密码”功能窗体约束


Symfony custom constraint to Reset Password function form

我已经为我的项目实现了一个密码重置页面。它是有效的,但我尝试使用最佳实践和可重用代码。所以问题来了。我有一个用于密码重置表单的FormType和一个重置控制器。我知道验证通常意味着将表单类型的字段映射到类的对象,并对该对象的属性制定验证规则。但对于密码重置,我认为需要使用"非映射"字段。现在,我提交表单并在ResettingController中获取值。在那里,我自己检查是否存在拥有电子邮件、生日和安全答案的用户。这是有效的,但我认为没有以正确的方式实施。是否可以向整个ResetFormType添加自定义约束,并且在提交表单时,它应该调用检查用户是否存在的约束。所以我想使用Symfony验证系统,而不是我在控制器中写的"如果,否则,如果…"。

这是我的代码:

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
            ));
}

重置控制器:

        $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()"方法,而不是将表单的每个字段保存在一个变量中,将其传递给存储库方法,并在那里手动检查用户是否存在。为此,我认为需要对整个形式进行约束。。?

更新:我认为我需要一个用于重置过程的模型类,并且对于整个类,我可以添加一个自定义验证约束。

谨致问候。

您可以在表单生成器中使用"constraints"选项:

public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder
        ->add('username', null, array(
            'label' => 'resetting.request.username',
            'translation_domain' => 'FOSUserBundle',
            'mapped' => false,
            'constraints' => [
                new YourCustomConstraint()
            ]
        ));
}

我现在为重置表单类型实现了一个"Model"类。在那里,我可以向属性(用户名、生日、securityAnswer)添加约束,然后向类本身添加约束。