Symfony自定义约束重置密码功能表单

时间:2014-11-13 09:06:04

标签: php forms validation symfony constraints

我已经为我的项目实施了密码重置页面。它工作正常,但我尝试使用最佳实践和可重用代码。所以这就是问题所在。 我有一个用于密码重置表单的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()”方法,而不是将表单的每个字段保存在变量中,将其传递给存储库方法并检查用户是否手动存在。为此,我认为需要对整个表格进行约束..?

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

问候。

2 个答案:

答案 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),然后另外向类本身添加约束。