Symfony2 добавить поле reCaptcha в форму регистрации - PullRequest
6 голосов
/ 03 января 2012

Я пытаюсь добавить 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 в поле капчи? Я пытался добавить это в 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 ошибку.

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

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

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

1 Ответ

4 голосов
/ 27 января 2012

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, но применяется к любой сущности Doctrine. Следуя этой статье, просто замените поле termsAccepted на поле recaptcha.

...