src/Form/EventListener/ReCaptchaValidationListener.php
<?php
declare(strict_types=1);
namespace FrankProjects\UltimateWarfare\Form\EventListener;
use ReCaptcha\ReCaptcha;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\Form\FormError;
use Symfony\Component\Form\FormEvent;
use Symfony\Component\Form\FormEvents;
use Symfony\Component\HttpFoundation\Request;
class ReCaptchaValidationListener implements EventSubscriberInterface
{
private ReCaptcha $reCaptcha;
private string $invalidMessage = 'The captcha is invalid.';
public function __construct(ReCaptcha $reCaptcha)
{
$this->reCaptcha = $reCaptcha;
}
public static function getSubscribedEvents(): array
{
return [
FormEvents::POST_SUBMIT => 'onPostSubmit'
];
}
public function setInvalidMessage(string $message): self
{
$this->invalidMessage = $message;
return $this;
}
public function onPostSubmit(FormEvent $event): void
{
$request = Request::createFromGlobals();
$result = $this->reCaptcha
->setExpectedHostname($request->getHost())
->verify((string) $request->request->get('g-recaptcha-response'), $request->getClientIp());
if (!$result->isSuccess()) {
$event->getForm()->addError(new FormError($this->invalidMessage));
}
}
}