laravel-math-captcha maintained by vivekco
Laravel MathCaptcha
A lightweight, privacy-friendly Laravel package that provides simple single-digit arithmetic CAPTCHA for human verification.
Supports only single-digit operations (1–9) with
+,-, and×.
Features
- Random single-digit math questions.
- Securely stores answers in server-side session.
- Easy integration with controllers and Blade forms.
- Works without external services or images.
- Compatible with Laravel 10+ / 11+.
Installation
For local development or testing, add the package as a path repository in your Laravel app:
"repositories": [
{
"type": "path",
"url": "../packages/laravel-math-captcha"
}
]
Require the package:
composer require vivekco/laravel-math-captcha:@dev
Laravel 10+ auto-discovers the service provider.
Optional: publish config if you want to customize defaults:
php artisan vendor:publish --provider="Vivekco\MathCaptcha\MathCaptchaServiceProvider" --tag=config
Usage
1. Generate a Math Question in Controller
$question = app('mathcaptcha')->generate();
$questionis a string like2 + 3,4 × 7, etc.- The answer is automatically stored in session (
math_captcha_answerby default).
2. Blade Form Example (With Error handling)
<form method="POST" action="{{ route('contact.submit') }}">
@csrf
<label for="captcha_answer">Solve: {{ $question }}</label>
<input type="text" id="captcha_answer" name="captcha_answer" required>
<button type="submit">Submit</button>
</form>
@error('captcha_answer')
<div style="color:red">{{ $message }}</div>
@enderror
3. Validation in Controller
$request->validate([
'captcha_answer' => ['required', function ($attribute, $value, $fail) {
if (!app('mathcaptcha')->check($value)) {
$fail('The math captcha answer is incorrect.');
}
}]
]);
check($value)returnstrueif correct,falseif incorrect.
Config (Optional)
Published config: config/mathcaptcha.php
return [
'min' => 1,
'max' => 9,
'operations' => ['+', '-', '×'],
'session_key' => 'math_captcha_answer',
'allow_negative' => true,
];
min/max: range of digits.operations: allowed operators.session_key: session key storing the answer.allow_negative: prevent negative results if false.
Local Testing
- Serve your Laravel app:
php artisan serve
-
Visit your test route, generate a question, submit correct/incorrect answers.
-
Run package tests (inside package folder):
./vendor/bin/phpunit tests
Contributing
- Fork the repository.
- Create a feature branch:
git checkout -b feat/my-feature. - Write tests for your changes.
- Commit and push.
- Open a Pull Request describing the change.
Follow PSR-12 coding standards.
License
MIT © Vivekco