kaistaerk/hcaptcha-bundle

用于表单中使用hCaptcha的Symfony包

安装: 100

依赖者: 0

建议者: 0

安全性: 0

星标: 0

关注者: 0

分支: 10

类型:symfony-bundle

v4.0.2 2024-04-26 15:56 UTC

README

此包将HCaptchaType新表单类型引入您的Symfony网站,用于显示和验证由https://www.hcaptcha.com提供的CAPTCHA。

此包已针对Symfony的主要版本3、4、5和6进行了测试。主要版本2适用于Symfony 3和4,PHP 7.2+;主要版本3适用于Symfony 5和6,PHP 7.4或8.x;主要版本4适用于Symfony 6.4和7,PHP 8.2+。测试依赖项的要求可能更加严格。

安装

使用Symfony Flex的应用程序

打开命令行,进入您的项目目录并执行

$ composer require meteo-concept/hcaptcha-bundle

为了避免让您安装另一个HTTP客户端(如果已经安装了兼容的客户端),此包依赖于虚拟包,即PSR-18 psr/http-client-interface和PSR-17 psr/http-factory-interface。如果您还没有安装任何真实包来提供这些接口的实现,Composer将抱怨该包不可安装。在这种情况下,您必须在与包同时提供实时实现。

例如,从Symfony 4开始

$ composer require meteo-concept/hcaptcha-bundle symfony/http-client nyholm/psr7

对于Symfony 3

$ composer require meteo-concept/hcaptcha-bundle guzzlehttp/guzzle nyholm/psr7

不使用Symfony Flex的应用程序

步骤1:下载包

使用上述命令之一安装包。现在您必须启用它并配置它,无需使用配方。

步骤2:启用包

然后,通过将其添加到项目中config/bundles.php文件中注册的包列表来启用包

// config/bundles.php

return [
    // ...
    MeteoConcept\HCaptchaBundle\MeteoConceptHCaptchaBundle::class => ['all' => true],
];

配置

此CAPTCHA提供了Symfony flex contrib配方,因此如果您已启用,则应包含配置。否则,您可以从contrib存储库中复制配置:https://github.com/symfony/recipes-contrib/tree/master/meteo-concept/hcaptcha-bundle

配置包,例如在config/packages/meteo_concept_hcaptcha.yml

parameters:
    hcaptcha_site_key: '%env(resolve:HCAPTCHA_SITE_KEY)%'
    hcaptcha_secret: '%env(resolve:HCAPTCHA_SECRET)%'

meteo_concept_h_captcha:
  hcaptcha:
    site_key: '%hcaptcha_site_key%'
    secret: '%hcaptcha_secret%'
  validation: 'strict' # this is the default

并在.env中进行相应的更改

HCAPTCHA_SITE_KEY="10000000-ffff-ffff-ffff-000000000001"
HCAPTCHA_SECRET="0x0000000000000000000000000000000000000000"

站点密钥和密钥是hCaptcha在https://dashboard.hcaptcha.com提供的值。全局配置使所有CAPTCHA默认使用相同的站点密钥,但可以在每个表单的定义中更改它。

此处显示的值是可用于集成测试的虚拟值(https://docs.hcaptcha.com/#integrationtest)。将真实值放入.env.local(至少,密钥是公开的,密钥是虚拟的)。

验证可以设置为'严格'或'宽松'。如果为'宽松',则即使hCaptcha端点超时或返回HTTP 500错误等(以避免过度挫败用户),CAPTCHA也将被视为有效。如果为严格(默认值),则除非端点返回"success: true"答案,否则CAPTCHA将不被视为有效。

配置Twig以加载hCaptcha小部件的特定模板(或提供自己的模板)。

twig:
    ...
    form_themes:
        - '@MeteoConceptHCaptcha/hcaptcha_form.html.twig'
        - ...

如果您使用Guzzle或其他HTTP库,则可能还需要为该包及其服务提供配置。例如,对于Guzzle,您可能在services.yaml中需要以下内容

services:
    Psr\Http\Client\ClientInterface:
        class: GuzzleHttp\Client
    Psr\Http\Message\RequestFactoryInterface:
        class: Nyholm\Psr7\Factory\Psr17Factory
    Psr\Http\Message\StreamFactoryInterface:
        class: Nyholm\Psr7\Factory\Psr17Factory

用法

在您的表单中使用此CAPTCHA

<?php

namespace App\Form;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\Form\Extension\Core\Type\TextareaType;
use Symfony\Component\Form\Extension\Core\Type\ChoiceType;

use MeteoConcept\HCaptchaBundle\Form\HCaptchaType;

class ContactType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('name', TextType::class, [
                'label' => 'Name',
            ])
            ->add('email', TextType::class, [
                'label' => 'Email',
            ])
            ->add('message', TextareaType::class, [
                'label' => 'How can we help you ?',
            ])
            ->add('captcha', HCaptchaType::class, [
                'label' => 'Anti-bot test',
                // optionally: use a different site key than the default one:
                'hcaptcha_site_key' => '10000000-ffff-ffff-ffff-000000000001',
            ])
        ;
    }
}

默认情况下,HCaptchaFormType 类会验证字段是否符合 NotBlankIsValidCaptcha 约束(这是一个新约束,与该包一起安装,其验证器通过调用 hCaptcha API 来进行 CAPTCHA 检查)。您可以通过将 constraints 选项传递给表单生成器来覆盖这组约束。此外,由于持久化 CAPTCHA 值没有太大意义,所以默认情况下 HCaptchaFormType 字段都会传递 'mapped' => false

更新和重大变更

  • 在主版本 2 中,已删除对 PHP7.1 的支持,并添加了对 PHP8.0 的支持。
  • 在主版本 3 中
    • 已删除对 PHP <7.4 的支持
    • 已删除对 Symfony <5.3 的支持
    • 已添加对 Symfony 6.0 的支持
  • 在主版本 4 中
    • 已删除对 PHP <8.2 的支持
    • 已删除对 Symfony <6.4 的支持
    • 已添加对 Symfony 7.0 的支持