Integrationen

Captcha in Symfony: FormType, Validator-Constraint und Controller-Attribut

Aktualisiert am · 6 Min. Lesezeit

Symfony-Anwendungen haben ihre eigenen Muster: Form-Komponente, Validator, Attribute am Controller. Das CaptchaCore-Bundle fügt sich in genau diese Muster ein — Sie wählen den Weg, der zu Ihrem Projekt passt.

Installation

Tragen Sie das CaptchaCore-Repository in Ihre composer.json ein und installieren Sie das Bundle:

"repositories": [
    { "type": "composer", "url": "https://captchacore.eu/packages" }
]

composer require captchacore/captchacore-bundle

Danach das Bundle in config/bundles.php eintragen und die Konfiguration anlegen:

// config/bundles.php
CaptchaCore\SymfonyBundle\CaptchaCoreBundle::class => ['all' => true],

# config/packages/captchacore.yaml
captchacore:
    service_url: '%env(CAPTCHACORE_URL)%'
    site_key: '%env(CAPTCHACORE_SITE_KEY)%'
    secret_key: '%env(CAPTCHACORE_SECRET_KEY)%'

Die Schlüssel gehören in die .env:

CAPTCHACORE_URL=https://api.captchacore.eu
CAPTCHACORE_SITE_KEY=cc_pub_…
CAPTCHACORE_SECRET_KEY=cc_sec_…

Der empfohlene Weg: FormType

use CaptchaCore\SymfonyBundle\Form\Type\CaptchaCoreType;

$builder
    ->add('email', EmailType::class)
    ->add('message', TextareaType::class)
    ->add('captcha', CaptchaCoreType::class, [
        'form_type' => 'contact',
    ]);

Das Feld rendert Widget und Token; die Prüfung passiert beim Validieren des Formulars wie bei jedem anderen Feld. Weil das Skript mit dem Feld ausgegeben wird, lädt es nur auf Seiten mit diesem Formular.

Drei weitere Wege

  • Controller-Attribut: #[RequiresCaptcha(formType: 'contact')] prüft den Token, bevor die Action läuft — ohne Code in der Methode.
  • Validator-Constraint: #[CaptchaCoreToken(formType: 'contact')] an einer Eigenschaft Ihres DTOs, etwa für API-Payloads.
  • Twig-Funktion: captchacore_widget() für handgebaute Formulare außerhalb der Form-Komponente.

Programmatisch prüfen Sie mit dem CaptchaCoreClient: $result = $this->captcha->verify($token, 'login') liefert unter anderem Risikowert, Aktion und Begründungen.

Tests ohne Netzwerk

CaptchaCoreClient::fake(VerificationResult::allow());
$this->client->request('POST', '/contact', [...]);
self::assertResponseIsSuccessful();

Das Bundle unterstützt Symfony 6.4 LTS, 7.x und 8.x ab PHP 8.2. Alle Details in der Dokumentation und auf der Seite CAPTCHA-Bundle für Symfony.

Häufige Fragen

Welche Symfony-Versionen werden unterstützt?

Symfony 6.4 LTS, 7.x und 8.x mit PHP 8.2 oder neuer (Symfony 8 selbst verlangt PHP 8.4).

Brauche ich Symfony Flex?

Nein. Sie tragen das Bundle einmalig in config/bundles.php ein und legen config/packages/captchacore.yaml an — mit oder ohne Flex.

Funktioniert das Bundle mit API Platform?

Ja, über die Validator-Constraint an Ihren Input-DTOs.