Skip to main content

Wat is Laravel Pennant

Laravel Pennant is een eenvoudig en lichtgewicht pakket voor feature flags. Met feature flags kun je nieuwe functionaliteit stapsgewijs uitrollen, A/B-tests uitvoeren en trunk-based development ondersteunen.

Wat zijn feature flags

Met feature flags kun je het deployen van code loskoppelen van het releasen. Je kunt de code naar productie deployen en het aan- of uitzetten van functionaliteit via configuratie regelen.

Installatie

1

Het pakket installeren

Installeer Pennant met Composer.
2

Configuratiebestand en migraties publiceren

Publiceer de bestanden met het Artisan-commando vendor:publish.
Hiermee worden config/pennant.php en de migratiebestanden in database/migrations aangemaakt.
3

De migraties uitvoeren

Maakt de tabel features aan waarin Pennant de waarden van feature flags opslaat.

Configuratie

In config/pennant.php stel je de te gebruiken storagedriver in. Pennant ondersteunt twee drivers.

Features definiëren

Definitie op basis van closures

Features definieer je met de define-methode van de Feature-facade. Meestal doe je dit in de boot-methode van een serviceprovider. Aan de closure wordt een “scope” doorgegeven (meestal de geauthenticeerde gebruiker).
De logica van deze feature is als volgt:
  • Interne teamleden staan altijd op AAN
  • Klanten met veel verkeer staan op UIT
  • Voor de rest is de kans 1% dat de feature AAN staat
Wanneer een feature voor het eerst wordt gecontroleerd, wordt het resultaat van de closure opgeslagen in de storagedriver. Bij volgende keren wordt de opgeslagen waarde gebruikt.
Als de definitie alleen een Lottery teruggeeft, kun je de closure weglaten.

Definitie op basis van klassen

Pennant ondersteunt ook feature-definities op basis van klassen. Bij klassen is registratie in een serviceprovider niet nodig.
De gegenereerde klasse wordt in de directory app/Features geplaatst. Je hoeft alleen de resolve-methode te implementeren.

De opgeslagen naam aanpassen

Standaard wordt de volledig gekwalificeerde klassenaam opgeslagen. Met het Name-attribuut kun je de naam aanpassen.

Featurechecks onderscheppen (de before-methode)

Aan een klassegebaseerde feature kun je een before-methode toevoegen. Deze methode wordt in het geheugen uitgevoerd vóórdat de waarde uit de storage wordt opgehaald; geeft hij een waarde anders dan null terug, dan wordt die waarde gebruikt.
De before-methode is handig om een feature in noodgevallen uit te schakelen bij een bug, of om een uitrol op een bepaald tijdstip in te plannen.

Features controleren

Feature::active() / Feature::inactive()

Met de active-methode controleer je of een feature actief is. Standaard wordt de check uitgevoerd voor de momenteel geauthenticeerde gebruiker.
Bij een klassegebaseerde feature geef je de klassenaam door.
Er zijn ook andere handige methodes beschikbaar.

Voorwaardelijk uitvoeren (when / unless)

Met de when-methode voer je een closure alleen uit als de feature actief is.
unless is het omgekeerde van when en voert de eerste closure uit als de feature inactief is.

De HasFeatures-trait

Voeg je de HasFeatures-trait toe aan het User-model, dan kun je features rechtstreeks vanuit het model controleren.

Blade-directives

In Blade-templates kun je de @feature-directive gebruiken.

Middleware

Met de EnsureFeaturesAreActive-middleware geef je aan dat toegang tot een route een feature vereist. Is de feature inactief, dan wordt een 400 Bad Request teruggegeven.
Gebruik de whenInactive-methode om de response aan te passen.

In-memory cache

Pennant cachet featureresultaten in het geheugen binnen één request. Zelfs als je dezelfde feature flag meerdere keren controleert, worden er geen extra databasequery’s uitgevoerd. Gebruik de flushCache-methode om de cache handmatig te legen.

Scopes

Een scope opgeven

Standaard is de geauthenticeerde gebruiker de scope, maar met de for-methode kun je een willekeurige scope opgeven.
Een voorbeeld waarbij features per team worden beheerd.

De standaardscope aanpassen

Met Feature::resolveScopeUsing kun je de standaardscope aanpassen.
Na configuratie wordt bij het weglaten van for de standaardscope gebruikt.

Nullable scope

Als de scope null is (niet-geauthenticeerde routes, Artisan-commando’s, enzovoort) en de feature-definitie niet met null overweg kan, wordt automatisch false teruggegeven. Wil je null verwerken, definieer dan met een nullable type.

Rijke featurewaarden

Features kunnen ook andere waarden dan booleans teruggeven. Bijvoorbeeld om de kleur van een knop te bepalen in een A/B-test.
Gebruik de value-methode om de waarde op te halen.
In Blade kun je ook op waarde vertakken.
Bij rijke waarden wordt elke waarde behalve false als actief beschouwd.
Wanneer een rijke waarde aan de when-methode wordt doorgegeven, ontvangt de eerste closure de waarde.

Meerdere features ophalen

Met de values-methode haal je de waarden van meerdere features in één keer op.
Met de all-methode haal je de waarden van alle gedefinieerde features op.
Om klassegebaseerde features in het resultaat van all op te nemen, roep je discover aan in een serviceprovider.
Hiermee worden alle featureklassen in de directory app/Features geregistreerd.

Eager loading

Wanneer je featurechecks in een lus uitvoert, kunnen prestatieproblemen ontstaan. Dit los je op door de waarden vooraf op te halen met de load-methode.
Gebruik loadMissing om alleen nog niet opgehaalde waarden op te halen.

Waarden bijwerken

Handmatig bijwerken

Met de methodes activate / deactivate schakel je een feature aan of uit.
Gebruik de forget-methode om de opgeslagen waarde te laten vergeten. Bij de volgende check wordt de waarde opnieuw geëvalueerd op basis van de definitie.

Bulksgewijs bijwerken

Met activateForEveryone / deactivateForEveryone pas je een waarde in één keer toe op alle scopes in de storage.

Features purgen

Als je een feature uit je applicatie verwijdert of de definitie wijzigt, kun je de waarden uit de storage verwijderen (purgen).
Purgen kan ook met een Artisan-commando. Handig om op te nemen in je deploypipeline.

Testen

Features herdefiniëren

In tests kun je de returnwaarde sturen door de feature opnieuw te definiëren met Feature::define.
tab=Pest
tab=PHPUnit
Klassegebaseerde features werken op dezelfde manier.
tab=Pest
tab=PHPUnit

De store voor tests instellen

De store die tijdens tests wordt gebruikt, kun je opgeven via een omgevingsvariabele in phpunit.xml.

Custom drivers

Als de bestaande drivers niet aan je eisen voldoen, kun je een custom driver maken. Je implementeert de interface Laravel\Pennant\Contracts\Driver.
Registreer de driver door extend aan te roepen in de boot-methode van een serviceprovider.
Na registratie kun je de driver opgeven in config/pennant.php.

Samenvatting

Volgende stappen

Debuggen en foutafhandeling

Leer hoe exceptions en rapportage in je applicatie werken.

Laravel Pulse

Zet een dashboard op voor het monitoren van de prestaties van je applicatie.
Laatst gewijzigd op 6 september 2026