You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Symfony控制器中检查reCAPTCHA是否已勾选?

在PHP控制器中检查reCAPTCHA勾选状态的方法

当然可以在控制器里直接判断用户是否勾选了reCAPTCHA的「我不是机器人」复选框,核心思路是检查提交请求里的g-recaptcha-response字段——用户未勾选时,这个字段会是空值。

具体实现步骤

在你的ContactController.php的表单提交处理逻辑中,添加以下判断:

public function contact(Request $request, FormFactoryInterface $formFactory)
{
    $form = $formFactory->create(ContactFormType::class);
    $form->handleRequest($request);

    if ($form->isSubmitted()) {
        // 先检查reCAPTCHA是否被勾选
        $recaptchaResponse = $request->request->get('g-recaptcha-response');
        if (empty($recaptchaResponse)) {
            $form->addError(new \Symfony\Component\Form\FormError('请勾选「我不是机器人」'));
        }

        // 只有勾选了,才继续后续的表单验证和reCAPTCHA API校验
        if ($form->isValid()) {
            // 调用ReCaptchaValidationListener的验证逻辑,或者直接调用reCAPTCHA API
            $isRecaptchaValid = $this->reCaptchaValidator->validate($recaptchaResponse);
            if (!$isRecaptchaValid) {
                $form->addError(new \Symfony\Component\Form\FormError('reCAPTCHA验证失败,请重试'));
            } else {
                // 处理表单提交逻辑,比如发送邮件等
                return $this->redirectToRoute('contact_success');
            }
        }
    }

    return $this->render('contact.html.twig', [
        'form' => $form->createView(),
    ]);
}

注意事项

  • 前端可以做辅助提示(比如提交前判断复选框状态),但后端必须做这个校验,因为前端校验很容易被绕过。
  • 如果你的ReCaptchaValidationListener已经在处理API验证,那控制器里的空值判断可以作为前置校验——先拦截未勾选的情况,再让Listener处理已勾选但验证失败的情况,避免不必要的API请求。
  • 确保你的Twig模板里正确渲染了reCAPTCHA组件,生成的g-recaptcha-response字段能被正常提交:
    {{ form_start(form) }}
        {# 其他表单字段 #}
        <div class="g-recaptcha" data-sitekey="你的站点密钥"></div>
        {{ form_widget(form.submit) }}
    {{ form_end(form) }}
    <script src="https://www.google.com/recaptcha/api.js"></script>
    

内容的提问来源于stack exchange,提问作者Emilie Tossan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 01:59:56