uestla / recaptcha-control
Nette 框架表单的 reCAPTCHA 控件
Requires
- php: >=7.2
- nette/di: ^3.0
- nette/forms: ^3.0
- nette/http: ^3.0
- nette/php-generator: ^3.0 || ^4.0
- nette/utils: ^3.0 || ^4.0
Requires (Dev)
- guzzlehttp/guzzle: ^7.4
- nette/bootstrap: ^3.1
- nette/tester: ^2.4
- phpstan/extension-installer: ^1.1
- phpstan/phpstan: ^1.4
- phpstan/phpstan-deprecation-rules: ^1.0
- phpstan/phpstan-nette: ^1.0
- phpstan/phpstan-strict-rules: ^1.1
- tracy/tracy: ^2.9
Suggests
- ext-curl: Needed by the default ReCaptchaControl\Http\Requester\CurlRequester.
- guzzlehttp/guzzle: Needed by ReCaptchaControl\Http\Requester\GuzzleRequester.
README
将 reCAPTCHA 控件添加到 Nette 框架表单中。
文档
安装
为了方便安装,请使用 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>
就是这样!:-)
请求者
请求者是发送 HTTP 请求的层。当你的生产环境不符合默认要求(cURL 扩展等)时,它会很有用。
你可以通过设置 配置 中的 requester
键来更改默认的请求者。值可以是类名或另一个服务的名称(下面有详细说明)。
-
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_* 常量作为字符串键(它们在内部被转换)。
-
SimpleRequester
使用流上下文调用
file_get_contents()
。recaptcha: ... requester: ReCaptchaControl\Http\Requester\SimpleRequester
-
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
-
自定义请求者
你也可以实现自己的请求者。只需确保它实现了 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。
要在您的本地机器上运行它,请执行以下操作
- 将
config/local.neon.template
复制到config/local.neon
- 在
config/local.neon
中正确填写reCAPTCHA密钥 - 运行
composer install
- 运行
bower install
之后,您应该能够通过您的本地Web服务器运行它。
表单定义在TestPresenter中。
单独的示例模板位于presenters/templates目录中。