uestla/recaptcha-control

Nette 框架表单的 reCAPTCHA 控件

9.0.1 2023-09-12 09:51 UTC

README

将 reCAPTCHA 控件添加到 Nette 框架表单中。

文档

  1. 安装
  2. 配置
  3. 使用方法
  4. 请求者
  5. AJAX
  6. 不可见 reCAPTCHA
  7. 测试

安装

为了方便安装,请使用 Composer

composer require uestla/recaptcha-control

也不要忘记包含官方 JavaScript 库

<script src="https://www.google.com/recaptcha/api.js" async defer></script>

如果你使用 AJAX,你可能希望使用库资源 - 查看更多

配置

要能在你的表单中使用 reCAPTCHA 控件,只需在你的 config.neon 中注册 DI 扩展即可

extensions:
	recaptcha: ReCaptchaControl\DI\Extension

recaptcha:
	# required
	siteKey: '<your_site_key>'
	secretKey: '<your_secret_key>'

	# optional
	methodName: 'addReCaptcha'
	requester: ReCaptchaControl\Http\Requester\CurlRequester

参数

使用方法

表单

要实际将 reCAPTCHA 添加到你的表单中,只需调用

$form->addReCaptcha(
	'captcha', // control name
	'reCAPTCHA for you', // label
	"Please prove you're not a robot." // error message
);

请注意,验证规则会自动添加,因此你根本不需要调用任何 addRule()

模板

然后你可以使用宏和 n:attr 方法在你的 Latte 模板中渲染控件

<form ...>
	{* n:attr *}
	<div n:name="captcha"></div>

	{* or macro *}
	{input captcha}

	{* don't forget to render potential errors *}
	{$form['captcha']->getError()}
</form>

就是这样!:-)

reCAPTCHA

请求者

请求者是发送 HTTP 请求的层。当你的生产环境不符合默认要求(cURL 扩展等)时,它会很有用。

你可以通过设置 配置 中的 requester 键来更改默认的请求者。值可以是类名或另一个服务的名称(下面有详细说明)。

  1. CurlRequester

    这是默认的,因为配置中的 requester 值是可选的。

    它使用 PHP cURL 扩展。如果你想为请求设置任何 CURLOPT_* 值,你必须创建一个服务并传递这些选项到构造函数中

    recaptcha:
    	...
    	requester: @curlRequester
    
    services:
    	curlRequester:
    		class: ReCaptchaControl\Http\Requester\CurlRequester
    		arguments:
    			-
    				CURLOPT_CAINFO: %appDir%/res/cacert.pem
    				CURLOPT_USERAGENT: 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.104 Safari/537.36'

    如示例所示,你可以使用所有 CURLOPT_* 常量作为字符串键(它们在内部被转换)。

  2. SimpleRequester

    使用流上下文调用 file_get_contents()

    recaptcha:
    	...
    	requester: ReCaptchaControl\Http\Requester\SimpleRequester
  3. GuzzleRequester

    如果你已经在你的应用程序中使用了 Guzzle HTTP 客户端,这个请求者可能很有用

    recaptcha:
    	...
    	requester: ReCaptchaControl\Http\Requester\GuzzleRequester
    
    services:
    	- Guzzle\Http\Client # will be autowired to the GuzzleRequester constructor

    如果你使用多个客户端,最好是定义请求者作为一个独立的服务

    recaptcha:
    	...
    	requester: @guzzleRequester
    
    services:
    	guzzleRequester: ReCaptchaControl\Http\Requester\GuzzleRequester(@primaryGuzzleHttpClient)
    
    	primaryGuzzleHttpClient: Guzzle\Http\Client
    	secondaryGuzzleHttpClient: Guzzle\Http\Client
  4. 自定义请求者

    你也可以实现自己的请求者。只需确保它实现了 ReCaptchaControl\Http\Requester\IRequester 接口。

    它基本上需要单个 public function post(string $url, array $values = []): string 方法,该方法接受 URL,执行带有给定 $values 的 HTTP POST 请求,并返回响应体的字符串。在失败的情况下,应该抛出 ReCaptchaControl\Http\Requester\RequestException

    然后你可以像上面一样使用它

    recaptcha:
    	requester: MyRequesterClass

    或者当你有某些依赖时

    recaptcha:
    	requester: @myRequester
    
    services:
    	myRequester:
    		factory: MyRequesterClass( ... )
    		...

AJAX

当包含 reCAPTCHA 控件的片段更新时,需要重新渲染 reCAPTCHA 本身。

如果您正在使用nette.ajax.js,您可能希望使用assets/recaptcha.ajax.js脚本。

您可以通过bower安装它。

bower install

重要提示:由于recaptcha.ajax.js脚本需要显式渲染reCATPCHAs显式,因此请小心不要自行加载。

不可见 reCAPTCHA

您也可以使用此库来实现不可见reCAPTCHA。后端部分保持不变,因此只需在前端进行适当的配置。要查看其实际效果,您可以访问https://kesspess.cz/recaptcha/invisible,并在测试中查看代码。

测试 & CI

自动化测试

此库使用Nette Tester进行自动化测试,并使用PHPStan进行静态分析。要自行运行它们,只需执行以下命令:

# runs test suite & static analysis
composer ci

手动测试

您可能已经注意到了tests/manual目录。其实际内容位于https://kesspess.cz/recaptcha

要在您的本地机器上运行它,请执行以下操作

  1. config/local.neon.template复制到config/local.neon
  2. config/local.neon中正确填写reCAPTCHA密钥
  3. 运行composer install
  4. 运行bower install

之后,您应该能够通过您的本地Web服务器运行它。

表单定义在TestPresenter中。

单独的示例模板位于presenters/templates目录中。