我正在尝试将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"
知道怎么解决吗? :)
答案 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
字段。