Symfony2将reCaptcha字段添加到注册表单

时间:2012-01-02 23:53:27

标签: forms symfony recaptcha symfony-2.0

我正在尝试将EWZRecaptcha添加到我的注册表单中。 我的注册表单构建器看起来像这样:

public function buildForm(FormBuilder $builder, array $options)
{
    $builder->add('username',  'text')
            ->add('password')
            ->add('recaptcha', 'ewz_recaptcha', array('property_path' => false));
}

public function getDefaultOptions(array $options)
{
    return array(
            'data_class' => 'Acme\MyBundle\Entity\User',
    );
}

现在,我如何将Recaptcha Constraint添加到验证码字段?我试着把它添加到validation.yml:

namespaces:
  RecaptchaBundle: EWZ\Bundle\RecaptchaBundle\Validator\Constraints\

Acme\MyBundle\Entity\User:
  ...
  recaptcha:
    - "RecaptchaBundle:True": ~

但我收到Property recaptcha does not exists in class Acme\MyBundle\Entity\User错误。

如果我从recaptcha字段的选项中删除array('property_path' => false),我会收到错误:

Neither property "recaptcha" nor method "getRecaptcha()" nor method "isRecaptcha()"
exists in class "Acme\MyBundle\Entity\User"

知道怎么解决吗? :)

1 个答案:

答案 0 :(得分:4)

Acme\MyBundle\Entity\User没有recaptcha属性,因此您在尝试验证User实体上的该属性时收到错误。设置'property_path' => false是正确的,因为它告诉Form对象它不应该尝试为域对象获取/设置此属性。

那么如何在此表单上验证该字段并仍然保留您的User实体?很简单 - 甚至可以在the documentation中解释。您需要自己设置约束并将其传递给FormBuilder。以下是你应该得到的结果:

<?php

use Symfony\Component\Validator\Constraints\Collection;
use EWZ\Bundle\RecaptchaBundle\Validator\Constraints\True as Recaptcha;

...

    public function getDefaultOptions(array $options)
    {
        $collectionConstraint = new Collection(array(
            'recaptcha' => new Recaptcha(),
        ));

        return array(
            'data_class' => 'Acme\MyBundle\Entity\User',
            'validation_constraint' => $collectionConstraint,
        );
    }

我不了解这个方法的一件事是,这个约束集合是否会与你的validation.yml合并,或者它是否会覆盖它。

您应该阅读this article,它更深入地解释了为实体和其他属性设置表单的正确过程。它特定于MongoDB,但适用于任何Doctrine实体。在撰写本文后,只需将termsAccepted字段替换为您的recaptcha字段。