kaistaerk / hcaptcha-bundle
用于表单中使用hCaptcha的Symfony包
Requires
- php: ^8.1
- psr/http-client: ^1.0
- psr/http-client-implementation: ^1.0
- psr/http-factory-implementation: ^1.0
- psr/http-message: ^1.0
- symfony/config: ~6.4|~7.0
- symfony/form: ~6.4|~7.0
- symfony/twig-bridge: ~6.4|~7.0
- symfony/validator: ~6.4|~7.0
Requires (Dev)
- matthiasnoback/symfony-dependency-injection-test: ^5.0
- nyholm/psr7: ^1.3
- nyholm/symfony-bundle-test: 2.0.x-dev
- php-http/mock-client: ^1.5
- phpunit/phpunit: ^9.5
- symfony/browser-kit: ^6.4|^7.0
- symfony/css-selector: ^6.4|^7.0
- symfony/framework-bundle: ^6.4|^7.0
- symfony/panther: ^2.0
- symfony/phpunit-bridge: ^6.4|^7.0
- symfony/twig-bundle: ^6.4|^7.0
Suggests
- symfony/http-client: A Symfony component that implements PSR-18 HTTP client interface
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 类会验证字段是否符合 NotBlank
和 IsValidCaptcha
约束(这是一个新约束,与该包一起安装,其验证器通过调用 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 的支持