mael/recaptcha-bundle
Mael RecaptchaBundle integrates Google reCAPTCHA into your PHP application's forms to help block spam and automated bot submissions. It provides straightforward configuration and server-side verification of user responses, making it easy to add basic bot protection to existing forms.
api.js, emit g-recaptcha-response, POST to siteverify, check success. This package is a useful reference shape, but it saves almost no effort over writing it ourselves — so the answer to "build vs. buy" is almost always "build small and own it."biscolab/laravel-recaptcha, anhskohbo/no-captcha, or Google's thin google/recaptcha SDK) wrapped in our own form-request validation rule.Consider it only if all of the following hold:
Look elsewhere or build in-house when:
To executives: Bot traffic on public forms is a real abuse and conversion risk, and CAPTCHA is cheap to implement but very visible in the signup funnel. My recommendation is not to adopt this specific package — it's been unreleased since 2020, has effectively zero adoption, and is Symfony-only, which doesn't match our Laravel stack. Instead, use it as a template for a small, owned integration. Estimated engineering cost is 1–2 days either way; the real decision is which CAPTCHA vendor we standardize on (Google reCAPTCHA vs. Cloudflare Turnstile vs. hCaptcha), which carries privacy and UX implications worth a short review.
To engineering: The work is small — a validation rule/form request, a Blade component, and config, roughly one to two days. Don't take a dependency on a 2-star, 2020-era Symfony bundle with no maintainer. Either fork it deliberately or (better) write the ~100 lines ourselves so we control the reCAPTCHA version (v2 vs. v3), the score thresholds, and the failure/fallback behavior when Google is unreachable. Keep the verifier behind an interface (verify(string $token, ?string $ip, ?string $action): Result) so we can swap vendors later, store secrets in .env only, enforce TLS on the outbound siteverify call, set a hard timeout (~2s), and decide fail-open vs. fail-closed per surface (fail closed on registration, fail open on low-risk contact forms). On Laravel, start from a maintained package and wrap it in our own form request rather than porting this bundle.
How can I help you explore Laravel packages today?