Skip to main content

Was ist Laravel Pennant

Laravel Pennant ist ein schlankes, einfaches Paket für Feature Flags. Mit Feature Flags können Sie neue Funktionen schrittweise ausrollen, A/B-Tests durchführen oder Trunk-Based Development unterstützen.

Was sind Feature Flags

Mit Feature Flags entkoppeln Sie Deployment und Release. Sie können den Code in Produktion deployen und das Feature konfigurativ ein- oder ausschalten.

Installation

1

Paket installieren

Installieren Sie Pennant mit Composer.
2

Konfigurationsdatei und Migrationen veröffentlichen

Veröffentlichen Sie die Dateien mit dem Artisan-Befehl vendor:publish.
Dadurch entstehen config/pennant.php und Migrationen unter database/migrations.
3

Migrationen ausführen

Legt die Tabelle features an, in der Pennant die Werte der Feature Flags speichert.

Konfiguration

In config/pennant.php legen Sie den verwendeten Storage-Treiber fest. Pennant unterstützt zwei Treiber:

Features definieren

Definition per Closure

Features werden über die Methode define der Feature-Fassade definiert – üblicherweise in der boot-Methode eines Service-Providers. Die Closure erhält einen „Scope“ (meist den authentifizierten Benutzer).
Die Logik lautet:
  • Interne Teammitglieder erhalten das Feature immer.
  • Kunden mit hohem Traffic erhalten es nicht.
  • Für alle anderen wird es mit 1 % Wahrscheinlichkeit aktiviert.
Beim ersten Prüfen wird das Ergebnis der Closure im Storage-Treiber gespeichert. Danach wird der gespeicherte Wert verwendet.
Wenn die Definition nur eine Lottery zurückgibt, können Sie die Closure weglassen.

Definition als Klasse

Pennant unterstützt auch klassenbasierte Feature-Definitionen. In diesem Fall ist keine Registrierung im Service-Provider erforderlich.
Die generierte Klasse liegt in app/Features. Implementieren Sie die Methode resolve.

Speichernamen anpassen

Standardmäßig wird der voll qualifizierte Klassenname gespeichert. Mit dem Attribut Name können Sie den Namen anpassen.

Feature-Prüfung abfangen (Methode before)

In klassenbasierten Features können Sie eine before-Methode definieren. Sie wird vor dem Zugriff auf den Storage im Speicher ausgeführt; gibt sie einen anderen Wert als null zurück, wird dieser verwendet.
Die before-Methode ist hilfreich, um bei Fehlern das Feature notfallmäßig zu deaktivieren oder einen Rollout auf einen bestimmten Zeitpunkt zu terminieren.

Features prüfen

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

Mit active prüfen Sie, ob ein Feature aktiv ist. Standardmäßig wird der aktuell authentifizierte Benutzer verwendet.
Für klassenbasierte Features übergeben Sie den Klassennamen.
Weitere praktische Methoden:

Bedingte Ausführung (when / unless)

Mit when führen Sie eine Closure nur aus, wenn das Feature aktiv ist.
unless ist die Umkehrung von when; die erste Closure läuft, wenn das Feature inaktiv ist.

Trait HasFeatures

Fügen Sie dem User-Modell das Trait HasFeatures hinzu, können Sie Features direkt am Modell prüfen.

Blade-Direktiven

In Blade können Sie die Direktive @feature verwenden.

Middleware

Mit der Middleware EnsureFeaturesAreActive geben Sie an, dass eine Route ein bestimmtes Feature benötigt. Ist das Feature inaktiv, wird 400 Bad Request zurückgegeben.
Über whenInactive passen Sie die Antwort an.

In-Memory-Cache

Innerhalb eines Requests cached Pennant die Ergebnisse im Speicher. Mehrfache Prüfungen desselben Feature Flags erzeugen keine zusätzlichen DB-Queries. Zum manuellen Leeren des Caches verwenden Sie flushCache.

Scopes

Scope festlegen

Standardmäßig ist der authentifizierte Benutzer der Scope. Mit for können Sie einen beliebigen Scope angeben.
Ein Beispiel, das Features je Team steuert:

Standard-Scope anpassen

Mit Feature::resolveScopeUsing passen Sie den Standard-Scope an.
Danach wird ohne for der Standard-Scope verwendet.

Nullable Scope

Ist der Scope null (z. B. bei nicht authentifizierten Routen oder Artisan-Befehlen) und die Feature-Definition kann kein null verarbeiten, wird automatisch false zurückgegeben. Wenn Sie null behandeln möchten, deklarieren Sie den Parameter als nullable.

Rich Feature Values

Features können auch andere Werte als Booleans zurückgeben – etwa um in einem A/B-Test die Buttonfarbe zu steuern.
Den Wert erhalten Sie mit value.
In Blade sind auch werteabhängige Verzweigungen möglich.
Bei Rich Values gilt jeder Wert außer false als aktiv.
Übergibt when einen Rich Value, erhält die erste Closure diesen Wert.

Mehrere Features gleichzeitig abrufen

Mit values holen Sie mehrere Feature-Werte auf einmal.
Mit all erhalten Sie alle definierten Feature-Werte.
Um klassenbasierte Features in all einzubeziehen, rufen Sie im Service-Provider discover auf.
Damit werden alle Feature-Klassen im Verzeichnis app/Features registriert.

Eager Loading

Prüfungen in Schleifen können zu Performance-Problemen führen. Mit load laden Sie die Werte vorab.
Um nur noch nicht geladene Werte zu laden, verwenden Sie loadMissing.

Werte aktualisieren

Manuell

Mit activate und deactivate schalten Sie Features ein bzw. aus.
Um den gespeicherten Wert zu verwerfen, verwenden Sie forget. Bei der nächsten Prüfung wird die Definition neu ausgewertet.

Sammel-Update

Mit activateForEveryone und deactivateForEveryone wenden Sie eine Änderung auf alle Scopes im Storage an.

Features purgen

Wenn ein Feature aus der Anwendung entfernt oder seine Definition geändert wurde, können Sie die Werte aus dem Storage entfernen (purgen).
Es geht auch per Artisan-Befehl – ideal für die Deploy-Pipeline.

Tests

Features neu definieren

In Tests steuern Sie die Rückgabewerte, indem Sie das Feature per Feature::define neu definieren.
tab=Pest
tab=PHPUnit
Klassenbasierte Features funktionieren genauso.
tab=Pest
tab=PHPUnit

Test-Store konfigurieren

Über eine Umgebungsvariable in phpunit.xml legen Sie den während Tests verwendeten Store fest.

Eigene Treiber

Wenn die vorhandenen Treiber nicht ausreichen, können Sie einen eigenen Treiber erstellen und dabei das Interface Laravel\Pennant\Contracts\Driver implementieren.
Registrieren Sie den Treiber in der boot-Methode eines Service-Providers per extend.
Anschließend können Sie den Treiber in config/pennant.php konfigurieren.

Zusammenfassung

Nächste Schritte

Debugging und Error Handling

Lernen Sie, wie Ihre Anwendung Ausnahmen behandelt und meldet.

Laravel Pulse

Führen Sie ein Performance-Monitoring-Dashboard für Ihre Anwendung ein.
Zuletzt geändert am 13. Juli 2026