Installation:
composer require veeqtoh/secure-code
Publish the config (optional but recommended for customization):
php artisan vendor:publish --provider="Veeqtoh\SecureCode\SecureCodeServiceProvider" --tag="config"
First Use Case: Generate a 6-digit alphanumeric code:
use Veeqtoh\SecureCode\Facades\SecureCode;
$code = SecureCode::generate(6); // Returns e.g., "A1b2C3"
Where to Look First:
config/secure-code.php (for customization like allowed characters, length ranges, etc.).SecureCode (for quick generation/validation).SecureCodeManager (for tracking codes in the database).Code Generation:
$code = SecureCode::generate(6); // Random 6-digit code
$code = SecureCode::generate(8, ['characters' => '0123456789ABCDEF']);
$code = SecureCode::generateBetween(4, 8); // Random length between 4-8
Validation:
if (SecureCode::validate('A1b2C3', 6)) {
// Valid code
}
Veeqtoh\SecureCode\Validation\SecureCodeValidator and bind it in the config:
'validator' => \App\Services\CustomSecureCodeValidator::class,
Tracking Codes (Database):
$code = SecureCode::allocate(6, 'user_id_123', ['metadata' => 'purpose']);
SecureCode::reset('A1b2C3'); // Marks as reusable
SecureCode::destroy('A1b2C3'); // Permanently removes from tracking
Facade vs. Manager:
SecureCode) for one-off generation/validation.SecureCodeManager) for persistent tracking (e.g., OTPs, coupons).OTP System:
// Generate and store OTP
$otp = SecureCode::allocate(6, $user->id, ['expires_at' => now()->addMinutes(5)]);
// Validate OTP later
if (SecureCode::validate($request->otp, 6) && $otp->user_id === $user->id) {
// Proceed
}
Coupon System:
// Generate unique coupon
$couponCode = SecureCode::generate(10, ['prefix' => 'COUPON_']);
// Track usage
$coupon = SecureCode::allocate(10, null, ['used' => false]);
$coupon->update(['used' => true]);
Bulk Generation:
$codes = collect(range(1, 100))->map(fn($i) => SecureCode::generate(8));
SecureCodeAllocated).SecureCode::fake() to mock codes in tests:
SecureCode::fake(['A1b2C3', 'D4e5F6']);
Character Collisions:
0O, 1I, 5S) if codes are user-facing.characters in config to exclude problematic ones.Database Tracking Overhead:
SecureCode) for stateless codes (e.g., one-time tokens).Validation Strictness:
Reused Codes:
'reusable' => true in config or use SecureCode::reset() to allow reuse.Thread Safety:
DB::transaction(function () {
$code = SecureCode::allocate(6, $user->id);
// Additional logic...
});
Code Not Validating:
$code = trim($request->input('code'));
Database Issues:
secure_codes table exists and migrations are run:
php artisan migrate
Custom Validator Errors:
SecureCodeValidator and ensure your class is autoloaded or manually bound in the config.Default Values:
'length' => 6, // Default code length
'characters' => '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ', // Alphanumeric
'reusable' => false, // Codes are non-reusable by default
'validator' => \Veeqtoh\SecureCode\Validation\SecureCodeValidator::class,
config/secure-code.php or dynamically in code:
SecureCode::setConfig(['characters' => '0123456789']);
Dynamic Length:
generateBetween() for variable-length codes, but ensure your validator supports the range.Custom Storage:
SecureCode::setManager(new \App\Services\RedisSecureCodeManager());
Code Generation Strategies:
SecureCodeGenerator with a custom class (e.g., for sequential codes):
'generator' => \App\Services\SequentialCodeGenerator::class,
Events:
SecureCodeAllocated, SecureCodeReset, or SecureCodeDestroyed events to trigger side effects (e.g., notifications):
SecureCode::allocated(function ($code) {
// Send email with the code
});
Rate Limiting:
RateLimiter::for('secure-code')->by($request->ip())->allow(5)->every(1)->response(function () {
return response('Too many attempts.', 429);
});
How can I help you explore Laravel packages today?