controlbit / reset-code
Requires
- php: >=8.3
- controlbit/doctrine-utils: dev-master
- symfony/dependency-injection: ^6.0|^7.0
- symfony/framework-bundle: ^6.0|^7.0
- symfony/orm-pack: ^2.4
Requires (Dev)
- dama/doctrine-test-bundle: *
- doctrine/doctrine-fixtures-bundle: ^2.0|^3.0
- infection/infection: *
- phpmd/phpmd: *
- phpstan/phpstan: *
- phpstan/phpstan-phpunit: *
- phpunit/phpunit: ^10.0
- rregeer/phpunit-coverage-check: *
- symfony/validator: ^6.4|^7.0
This package is auto-updated.
Last update: 2025-09-14 10:18:16 UTC
README
The ResetCode Bundle provides a simple, database-backed way to generate and manage temporary reset codes (e.g., verification codes, one-time passwords, password reset tokens). It integrates with Doctrine DBAL and automatically manages schema creation via Doctrine schema events.
Features
🔑 Generate short-lived reset codes with configurable size and TTL.
🗄️ Multiple tables supported, each with its own configuration.
🎭 Aliases for services to easily access different code managers.
⚡ Automatic Doctrine schema updates via event listeners.
Installation
composer require controlbit/reset-code
Put in Bundles file of your Symfony project:
return [ ControlBit\ResetCode\ResetCodeBundle::class => ['all' => true], ];
Configuration
# config/packages/reset_code.yaml reset_code: enabled: true tables: - name: "password_reset" alias: "user_reset" connection_name: "default" code_size: 6 ttl: 300 timeout_to_clear_oldest_ms: 250 allow_subject_duplicates: false - name: "phone_verification" alias: null connection_name: "readonly" code_size: 4 ttl: 120 timeout_to_clear_oldest_ms: 500 allow_subject_duplicates: true
Usage
Each configured table automatically registers a ResetCodeManager service.
Service IDs are built as:
reset_code.{name}
reset_code.{alias} (if alias is set)
reset_code.default (first configured table, acts as fallback)
You can also type-hint ControlBit\ResetCode\Service\ResetCodeManager
in your services — it will resolve to the default manager.
Example of generating a code:
use ControlBit\ResetCode\Service\ResetCodeManager; class PasswordResetService { public function __construct(private ResetCodeManager $resetCodeManager) {} public function requestReset(string $userId): string { return $this->resetCodeManager->generateCode($userId); } }
If you configured multiple tables:
$phoneResetManager = $container->get('reset_code.phone_verification'); $code = $phoneResetManager->generateCode($phoneNumber);
Database migrations
Generate migration or do schema update:
php bin/console doctrine:schema:update --force