Symfony2 добавить поле reCaptcha в регистрационную форму

Я пытаюсь добавить EWZRecaptcha в мою регистрационную форму. Моя регистрационная форма builder выглядит примерно так:

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' => 'AcmeMyBundleEntityUser',
    );
}

теперь, как я могу добавить ограничение Recaptcha в поле captcha? Я попытался добавить это в проверку.в формате YML:

namespaces:
  RecaptchaBundle: EWZBundleRecaptchaBundleValidatorConstraints

AcmeMyBundleEntityUser:
  ...
  recaptcha:
    - "RecaptchaBundle:True": ~

но я Property recaptcha does not exists in class AcmeMyBundleEntityUser ошибка.

если я удалить array('property_path' => false) из параметров поля recaptcha я получаю ошибку:

Neither property "recaptcha" nor method "getRecaptcha()" nor method "isRecaptcha()"
exists in class "AcmeMyBundleEntityUser"

есть идеи, как его решить? :)

1 ответов


Acme\MyBundle\Entity\User нет recaptcha свойство, поэтому вы получаете ошибки при попытке проверить это свойство на User сущности. Настройка 'property_path' => false - это правильно, так как это говорит Form объект, который он не должен пытаться получить/установить это свойство для объекта домена.

Итак, как вы можете проверить это поле в этой форме и по-прежнему сохранять свой User сущности? Просто-это даже объясняется в документация. Вам нужно будет настроить ограничение самостоятельно и передайте его 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 или если он перепишет его.

следует читать в этой статье что объясняет немного более глубокий процесс настройки форм с проверкой для сущностей и других свойств. Он специфичен для MongoDB, но применим к любой доктрине. Следуя этой статье, просто замените его