如何在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
相关产品推荐
相关产品推荐

