Skip to main content

Qu’est-ce que Laravel Pennant

Laravel Pennant est un package léger et simple pour les feature flags. Les flags permettent un rollout progressif, des A/B tests et complètent le développement trunk-based.

Concept

Les flags séparent déploiement et release : le code est en production, l’activation est contrôlée par configuration.

Installation

1

Installer le package

2

Publier config et migrations

Cela crée config/pennant.php et une migration dans database/migrations.
3

Migrer

Crée la table features où Pennant stocke les valeurs.

Configuration

Deux drivers de stockage supportés :

Définition de features

Basée sur une closure

Utilisez Feature::define dans un service provider boot. La closure reçoit le « scope » (généralement l’utilisateur authentifié).
Logique :
  • Interne → activé
  • Client à fort trafic → désactivé
  • Sinon → 1 % de chances
La valeur est calculée et persistée au premier check ; les checks suivants réutilisent la valeur.
Si la définition retourne juste une loterie, omettez la closure.

Basée sur une classe

Pas d’enregistrement dans un provider.
Fichier créé dans app/Features ; implémentez resolve.

Personnaliser le nom stocké

Par défaut, la classe FQN. Utilisez l’attribut Name.

Intercepter avec before

Cette méthode s’exécute avant la lecture du stockage : si elle retourne autre chose que null, cette valeur est utilisée.
Utile pour un kill switch en cas de bug ou un rollout programmé.

Vérification

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

Cible l’utilisateur authentifié par défaut.
Avec une classe :
Autres helpers :

Exécution conditionnelle (when / unless)

unless inverse la logique.

Trait HasFeatures

Ajoutez-le au modèle User pour interroger directement.

Directives Blade

Middleware

EnsureFeaturesAreActive protège une route ; sans le flag, 400 Bad Request.
Personnalisez la réponse via whenInactive.

Cache en mémoire

Pennant cache les résultats par requête. Vider manuellement :

Scopes

Spécifier un scope

Par défaut, l’utilisateur authentifié. Avec for, n’importe quoi.
Flag par équipe :

Personnaliser le scope par défaut

Après cela :

Scope null

Sans authentification (Artisan, etc.), une définition non typée pour null retourne automatiquement false. Typez avec nullable si vous voulez le gérer :

Valeurs riches

Les flags peuvent retourner autre chose qu’un booléen — par exemple pour un A/B test de couleur.
Lecture :
Blade branché sur la valeur :
Avec valeurs riches, tout ce qui n’est pas false est considéré comme actif.
Avec when, la valeur est passée à la première closure.

Lecture multiple

values récupère plusieurs valeurs.
all récupère toutes les valeurs définies.
Pour inclure les classes de feature dans all(), appelez discover dans un provider.
Cela enregistre toutes les classes de app/Features.

Eager loading

Dans une boucle, les checks entraînent des requêtes. Chargez à l’avance avec load.
loadMissing ne charge que ce qui manque.

Modifier les valeurs

Manuel

activate / deactivate :
forget supprime la valeur stockée ; elle sera recalculée.

En masse

activateForEveryone / deactivateForEveryone s’appliquent à tous les scopes en stock.

Purge

Retirez les valeurs quand vous supprimez ou modifiez une feature.
Version Artisan (utile en CI/CD) :

Tests

Redéfinir en test

Dans un test, redéfinissez pour contrôler la valeur.
tab=Pest
tab=PHPUnit
Idem avec les classes.
tab=Pest
tab=PHPUnit

Store pour les tests

Réglez dans phpunit.xml.

Driver personnalisé

Implémentez Laravel\Pennant\Contracts\Driver.
Enregistrez avec extend.
Puis dans config/pennant.php :

Récapitulatif

Prochaines étapes

Gestion des erreurs

Traitement des exceptions et rapports.

Laravel Pulse

Tableau de bord de performance.
Dernière modification le 13 juillet 2026