Skip to main content

Wat is de Lottery-klasse

Illuminate\Support\Lottery is een utility-klasse waarmee je kansgebaseerde operaties in een vloeiende API kunt uitdrukken. Patronen als “voer een bewerking maar eens per 100 requests uit” of “log alleen bij een deel van de requests gedetailleerd” schrijf je er eenvoudig mee.
De implementatie staat in src/Illuminate/Support/Lottery.php. Laravel gebruikt deze klasse ook intern in het framework, bijvoorbeeld voor de session-GC en het prunen van cachelocks.

Basisgebruik

De kans opgeven als gehele verhouding

Met Lottery::odds($chances, $outOf) geef je de kans op als “chanceskeerwinstperchances keer winst per outOf keer”.

De kans opgeven als decimaal

Als je $outOf weglaat en een decimaal tussen 0.0 en 1.0 meegeeft, wordt die rechtstreeks als kans gebruikt.
Als de decimale waarde groter is dan 1.0, wordt een RuntimeException gegooid.

Een boolean teruggeven zonder callbacks

Als je geen winner / loser instelt, geeft choose() true terug bij winst en false bij verlies.

Meerdere keren uitvoeren

Geef je aan choose($times) een aantal mee, dan krijg je een array met resultaten terug.

Doorgeven als callable

Een Lottery-instantie implementeert __invoke en kun je dus rechtstreeks doorgeven aan API’s die een callable verwachten.

Praktische use cases

1. Cache prunen (maar eens per 100 keer uitvoeren)

Ideaal voor onderhoudstaken die niet bij elke aanroep hoeven te draaien, zoals het verwijderen van verlopen records.

2. Telemetrie-sampling (alleen bij een deel van de requests gedetailleerd loggen)

Als het te duur is om alle requests te loggen, kun je dit voor sampling gebruiken.

3. A/B-test-achtig gedrag

Verdeel gebruikers probabilistisch over twee codepaden.

4. Periodieke taken willekeurig uitvoeren als aanvulling op de scheduler

Handig als je een taak willekeurig wilt uitvoeren en tegelijk dubbele uitvoering op meerdere servers wilt vermijden.

Probabilistische patronen binnen het Laravel-framework

Laravel gebruikt ook intern in het framework op grote schaal probabilistische onderhoudstaken. Sommige implementaties zijn geschreven vóór de Lottery-klasse bestond en gebruiken daarom rechtstreeks random_int(), maar ze zijn gebaseerd op hetzelfde idee.
1

Session: garbage collection

Illuminate\Session\Middleware\StartSession::configHitsLottery() gebruikt de lottery-instelling uit config/session.php en beslist met random_int of de GC wordt uitgevoerd.
2

DatabaseLock: verlopen locks prunen

Illuminate\Cache\DatabaseLock::acquire() verwijdert bij elke lock-acquisitie volgens hetzelfde verhoudingspatroon verlopen locks.
3

DB::whenQueryingForLongerThan — een Lottery-instantie doorgeven

Omdat een Lottery-instantie als callable kan worden doorgegeven, kun je hem rechtstreeks gebruiken als callback voor slow-query-detectie.
Waar Session en DatabaseLock rechtstreeks random_int() gebruiken, heeft de Lottery-klasse als voordeel dat je met alwaysWin() / alwaysLose() / fix() het resultaat in tests kunt sturen. Kies bij pakketontwikkeling voor de Lottery-klasse: dat verbetert de testbaarheid.

Gebruik in tests

Voor het testen van code met randomness gebruik je de test-API’s die Lottery aanbiedt.

Lottery::alwaysWin() — altijd laten winnen

Lottery::alwaysLose() — altijd laten verliezen

Lottery::fix() — resultaten fixeren met een sequentie

Je kunt de resultaten van meerdere aanroepen sturen met een array van true/false.
alwaysWin() / alwaysLose() / fix() wijzigen een globale statische property. Roep in de tearDown() van je test altijd Lottery::determineResultNormally() aan.

Lottery::setResultFactory() — een eigen factory injecteren

Als je fijnmazigere controle nodig hebt, gebruik je een eigen factory.

Toepassing in pakketontwikkeling

Registratie in de service provider

Als je onderhoudstaken inbouwt in de service provider van je pakket, gebruik je Lottery om de belasting te spreiden.

De odds uit de configuratie lezen

Door de kans configureerbaar te maken via een configuratiebestand, kunnen gebruikers hem makkelijk bijstellen.

Sampling in middleware

API-referentie

Gerelateerde pagina’s

Macroable-trait

Leer het uitbreidingspatroon waarmee je nieuwe methodes toevoegt aan bestaande klassen.

Conditionable-trait

Leer hoe je voorwaardelijke chains ontwerpt met when() / unless().
Laatst gewijzigd op 6 september 2026