Php Symfony重置密码功能窗体的自定义约束

Php Symfony重置密码功能窗体的自定义约束,php,forms,validation,symfony,constraints,Php,Forms,Validation,Symfony,Constraints,我已经为我的项目实现了一个密码重置页面。它正在工作,但我尝试使用最佳实践和可重用代码。这就是问题所在。 我有一个用于密码重置表单的表单类型和一个重置控制器。 我知道验证通常意味着将表单类型的字段映射到类的对象,并对该对象的属性拥有验证规则。 但是对于密码重置,我认为需要使用非映射字段。现在,我提交表单并在ResettingController中获取值。在那个里,我自己检查是否存在一个有电子邮件、生日和安全答案的用户。这是可行的,但我认为没有以正确的方式实施。 是否可以将自定义约束添加到整个Res

我已经为我的项目实现了一个密码重置页面。它正在工作,但我尝试使用最佳实践和可重用代码。这就是问题所在。 我有一个用于密码重置表单的表单类型和一个重置控制器。 我知道验证通常意味着将表单类型的字段映射到类的对象,并对该对象的属性拥有验证规则。 但是对于密码重置,我认为需要使用非映射字段。现在,我提交表单并在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
            ));
}
重置控制器:

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

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


注意。

您可以在表单生成器中使用“约束”选项:

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

我现在为reset表单类型实现了一个模型类。在那里,我可以向属性username、birthday、securityAnswer添加约束,然后再向类本身添加约束。

Ok,然后将该约束添加到我为ResetProcess创建的模型类中。对吗?通过此约束,您可以验证“用户名”字段中的值。不一定要将它添加到模型类中为什么是-1?这是官方最好的处理方法?!如果你没有得到通知,不要给它打分。