Time Bombs
Time bombs are features that automatically expire after a specified date, preventing abandoned feature flags from cluttering your codebase.
Setting Expiration Dates
Section titled “Setting Expiration Dates”Using expiresAt()
Section titled “Using expiresAt()”use Cline\Toggl\Toggl;
Toggl::define('black-friday-sale') ->expiresAt(now()->parse('2025-12-02 23:59:59')) ->resolver(fn($user) => true);
// With BackedEnumToggl::define(FeatureFlag::BlackFridaySale) ->expiresAt(now()->parse('2025-12-02 23:59:59')) ->resolver(fn($user) => true);
// After expiration, the feature returns false regardless of resolverUsing expiresAfter()
Section titled “Using expiresAfter()”Toggl::define('trial-feature') ->expiresAfter(days: 30) ->resolver(fn($user) => $user->isTrialing());
// Relative expirationToggl::define('temporary-access') ->expiresAfter(hours: 48) ->resolver(fn($user) => true);Checking Expiration
Section titled “Checking Expiration”Is Feature Expired?
Section titled “Is Feature Expired?”if (Toggl::isExpired('black-friday-sale')) { // Clean up related code}
// With BackedEnumif (Toggl::isExpired(FeatureFlag::BlackFridaySale)) { // Clean up related code}Get Expiration Date
Section titled “Get Expiration Date”$expiresAt = Toggl::expiresAt('trial-feature');// Returns CarbonInterface|null
if ($expiresAt && $expiresAt->isPast()) { // Feature has expired}
// With BackedEnum$expiresAt = Toggl::expiresAt(FeatureFlag::TrialFeature);Expiring Soon Warning
Section titled “Expiring Soon Warning”// Features expiring within 3 days$expiring = Toggl::expiringSoon(days: 3);// Returns array of feature names
// Send alertsforeach ($expiring as $feature) { Log::warning("Feature '{$feature}' expiring soon", [ 'expires_at' => Toggl::expiresAt($feature), ]);}Automatic Cleanup
Section titled “Automatic Cleanup”Manual Cleanup
Section titled “Manual Cleanup”// Remove all expired features from storageToggl::purge(); // Removes expired features
// Or specific featuresToggl::forget(['old-feature', 'deprecated-feature']);Scheduled Cleanup
Section titled “Scheduled Cleanup”Add to your scheduler in app/Console/Kernel.php:
use Cline\Toggl\Toggl;
protected function schedule(Schedule $schedule): void{ // Clean up expired features weekly $schedule->call(function () { Toggl::purge(); })->weekly();
// Warn about expiring features daily $schedule->call(function () { $expiring = Toggl::expiringSoon(days: 7);
foreach ($expiring as $feature) { Log::warning("Feature expiring soon: {$feature}"); } })->daily();}Use Cases
Section titled “Use Cases”Limited-Time Promotions
Section titled “Limited-Time Promotions”Toggl::define('summer-sale-2025') ->expiresAt('2025-08-31 23:59:59') ->resolver(fn() => true);
if (Toggl::active('summer-sale-2025')) { $discount = 0.20; // 20% off}Beta Testing Windows
Section titled “Beta Testing Windows”Toggl::define('beta-v2-api') ->expiresAfter(days: 90) ->resolver(fn($user) => $user->isBetaTester());
// After 90 days, beta access automatically revokedTemporary Feature Access
Section titled “Temporary Feature Access”Toggl::define('trial-premium-features') ->expiresAt($user->trial_ends_at) ->resolver(fn($user) => $user->onTrial());Emergency Toggles
Section titled “Emergency Toggles”// Quick toggle that auto-expiresToggl::define('maintenance-bypass') ->expiresAfter(hours: 2) ->resolver(fn($user) => $user->isAdmin());
// Automatically reverts after 2 hoursCombining with Other Features
Section titled “Combining with Other Features”Time Bomb + Dependencies
Section titled “Time Bomb + Dependencies”Toggl::define('base-feature', true);
Toggl::define('experimental-addon') ->requires('base-feature') ->expiresAfter(days: 30) ->resolver(fn($user) => true);Time Bomb + Percentage Rollout
Section titled “Time Bomb + Percentage Rollout”// 10% rollout for 2 weeksToggl::define('new-ui-test') ->strategy(new PercentageStrategy(10)) ->expiresAfter(weeks: 2);Time Bomb + Groups
Section titled “Time Bomb + Groups”Toggl::defineGroup('q4-features', [ 'holiday-theme', 'gift-recommendations', 'special-pricing',]);
// All features in group expire togetherToggl::define('holiday-theme')->expiresAt('2025-01-01');Toggl::define('gift-recommendations')->expiresAt('2025-01-01');Toggl::define('special-pricing')->expiresAt('2025-01-01');Best Practices
Section titled “Best Practices”-
Always set expiration for temporary features
// ✅ GoodToggl::define('experiment')->expiresAfter(days: 30);// ❌ Avoid - might forget to clean upToggl::define('experiment', true); -
Monitor expiring features
// Schedule regular checks$expiring = Toggl::expiringSoon(days: 7);if (count($expiring) > 0) {notify_team($expiring);} -
Document why features expire
// Clear intentToggl::define('promo-code-double-points')->expiresAt('2025-12-31') // End of promotional period->resolver(fn($user) => true);
Next Steps
Section titled “Next Steps”- Feature Groups - Managing related features
- Dependencies - Feature requirements
- Advanced Usage - Commands and automation