app->bind(SendQueuedMailable::class, PacedMail::class); } public function boot(): void { // Die Einstellungen werden im Rückruf gelesen, nicht hier: der Rückruf // läuft im Arbeiter je Auftrag, und eine Änderung des Betreibers wirkt // damit ab dem nächsten Auftrag statt erst ab dem nächsten Neustart. RateLimiter::for(MailLane::URGENT, fn () => Limit::perMinutes( $this->mindestensEins('mail.pace.urgent.minutes', 5), $this->mindestensEins('mail.pace.urgent.count', 30), )); RateLimiter::for(MailLane::CALM, fn () => Limit::perMinutes( $this->mindestensEins('mail.pace.calm.minutes', 10), $this->mindestensEins('mail.pace.calm.count', 20), )); } /** * Eine Zahl aus den Einstellungen, mindestens eins. * * Die Vorgabe in `Settings::get()` greift nur bei FEHLENDER Zeile. Eine * gespeicherte `null` — oder ein Wort statt einer Zahl — kommt als Wert * durch und wird von `(int)` zu 0, ohne dass jemand 0 eingetippt hätte. * Ein Kontingent von 0 hieße: `tooManyAttempts` ist immer wahr, jede Mail * wird endlos zurückgelegt und nach sechs Stunden gesammelt zu * `failed_jobs` — genau der Ausgang, den dieser Takt verhindern soll, nur * über einen anderen Weg. Ein Fenster von 0 Minuten hieße umgekehrt: gar * keine Drossel. * * Die Untergrenze steht hier, weil der Verlust hier passiert. Was ein * eingetipptes 0 bedeuten SOLL, ist eine Frage an die Eingabe und gehört * an die Konsolenseite — nicht an diese Lesestelle. */ private function mindestensEins(string $key, int $default): int { return max(1, (int) Settings::get($key, $default)); } }