<?php
namespace App\Form\Type;
use App\Form\EventListener\ReCaptchaValidationListener;
use ReCaptcha\ReCaptcha;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\Form\FormInterface;
use Symfony\Component\Form\FormView;
use Symfony\Component\OptionsResolver\OptionsResolver;
use Symfony\Contracts\Translation\TranslatorInterface;
/**
* Class ReCaptchaType.
*
* @see https://medium.com/@qferrer/securing-your-symfony-forms-with-google-recaptcha-v2-dbfc902b0c50
*
*/
class ReCaptchaType extends AbstractType
{
/**
* @var \ReCaptcha\ReCaptcha
*/
private $reCaptcha;
/**
* @var \Symfony\Contracts\Translation\TranslatorInterface
*/
protected $translator;
/**
* ReCaptchaType constructor.
*
* @param ReCaptcha $reCaptcha
*/
public function __construct(ReCaptcha $reCaptcha, TranslatorInterface $translator)
{
$this->reCaptcha = $reCaptcha;
$this->translator = $translator;
}
/**
* @inheritDoc
*/
public function buildForm(FormBuilderInterface $builder, array $options)
{
if($_ENV['USE_CAPTCHA']) {
$subscriber = new ReCaptchaValidationListener($this->reCaptcha, $this->translator);
$subscriber->setInvalidMessage($options['invalid_message']);
$builder->addEventSubscriber($subscriber);
}
}
/**
* @inheritDoc
*/
public function buildView(FormView $view, FormInterface $form, array $options)
{
$view->vars['type'] = $options['type'];
}
/**
* @inheritDoc
*/
public function configureOptions(OptionsResolver $resolver)
{
$resolver
->setDefault('type', 'invisible')
->setDefault('invalid_message', 'error.form.captcha_invalid')
->setAllowedValues('type', ['checkbox', 'invisible']);
}
}