Cette bibliothèque PHP implémente une infrastructure de basculement de fonctionnalités.
L'utilisation de la bibliothèque trompette/feature-toggles
peut aider une équipe à fournir de nouvelles fonctionnalités aux utilisateurs de manière itérative et sûre, en d'autres termes : elle permet un déploiement continu.
Pour plus d'informations sur le sujet, voir Feature Toggles (alias Feature Flags) sur MartinFowler.com.
La bibliothèque trompette/feature-toggles
est distribuée sur Packagist.
Il peut être ajouté en tant que dépendance du projet avec la commande suivante :
composer require trompette/feature-toggles
Lorsqu’on travaille sur une nouvelle version d’une page, déployer progressivement la nouvelle version peut apporter beaucoup de confiance à une équipe.
Mais cela apporte également plus de travail, car l'équipe doit :
Avec la bibliothèque trompette/feature-toggles
, l'activation de la nouvelle version se fait en demandant au routeur bascule si l'utilisateur actuel possède une fonctionnalité :
if ( $ toggleRouter -> hasFeature ( $ currentUser , ' new_page_version ' )) {
$ templating -> render ( ' new_page.tpl ' , $ newParameters );
} else {
$ templating -> render ( ' page.tpl ' , $ parameters );
}
Avant d'utiliser le routeur à bascule, la fonctionnalité new_page_version
doit être enregistrée :
use Trompette FeatureToggles FeatureDefinition ;
use Trompette FeatureToggles FeatureRegistry ;
$ featureRegistry = new FeatureRegistry ();
$ featureRegistry -> register ( new FeatureDefinition (
$ name = ' new_page_version ' ,
$ description = ' awesome new version of a page ' ,
$ strategy = ' whitelist '
));
Lors de la définition d'une fonctionnalité, une stratégie de basculement doit être référencée pour spécifier l'algorithme décidant si une cible possède une fonctionnalité.
Les stratégies mises en œuvre sont :
OnOff
,Whitelist
,Percentage
. Et les stratégies peuvent être combinées avec des opérateurs booléens, comme ceci : onoff and whitelist
, onoff or whitelist or percentage
, etc.
Maintenant que le registre de fonctionnalités est configuré, le routeur bascule peut être créé :
use Doctrine DBAL Connection ;
use Trompette FeatureToggles DBAL WhitelistStrategyConfigurationRepository ;
use Trompette FeatureToggles ToggleRouter ;
use Trompette FeatureToggles WhitelistStrategy Whitelist ;
$ connection = new Connection (...);
$ repository = new WhitelistStrategyConfigurationRepository ( $ connection );
$ whitelist = new Whitelist ( $ repository );
$ toggleRouter = new ToggleRouter (
$ featureRegistry ,
$ strategies = [ ' whitelist ' => $ whitelist ]
);
Les stratégies sont injectées sous forme de tableau indexé avec des noms : ce sont les références qui doivent être utilisées lors de l'enregistrement des fonctionnalités.
Le routeur bascule peut être utilisé pour configurer une fonctionnalité pour une stratégie donnée :
$ toggleRouter -> configureFeature ( ' feature ' , ' onoff ' , ' on ' );
$ toggleRouter -> configureFeature ( ' feature ' , ' onoff ' , ' off ' );
$ toggleRouter -> configureFeature ( ' feature ' , ' whitelist ' , ' allow ' , ' target ' );
$ toggleRouter -> configureFeature ( ' feature ' , ' whitelist ' , ' disallow ' , ' target ' );
$ toggleRouter -> configureFeature ( ' feature ' , ' percentage ' , ' slide ' , 25 );
$ toggleRouter -> configureFeature ( ' feature ' , ' percentage ' , ' slide ' , 50 );
Les modifications de configuration sont conservées en appelant la méthode associée sur l'instance de stratégie.
Tous les référentiels de configuration Doctrine DBAL peuvent migrer un schéma, puisqu'ils implémentent tous l'interface SchemaMigrator
:
use Doctrine DBAL Connection ;
use Trompette FeatureToggles DBAL WhitelistStrategyConfigurationRepository ;
$ connection = new Connection (...);
$ repository = new WhitelistStrategyConfigurationRepository ( $ connection );
$ repository -> migrateSchema ();
Tout le code précédent est facultatif lors de l'utilisation de Symfony : tout est collé par la classe FeatureTogglesBundle
.
L'enregistrement du bundle dans config/bundles.php
est nécessaire pour bénéficier de l'intégration Symfony :
return [
// ...
Trompette FeatureToggles Bundle FeatureTogglesBundle::class => [ ' all ' => true ],
];
Le bundle peut être configuré comme décrit par config:dump-reference
:
# Default configuration for extension with alias: "feature_toggles"
feature_toggles :
doctrine_dbal_connection : doctrine.dbal.default_connection
declared_features :
# Prototype
name :
description : ~ # Required
strategy : ~ # Required
Pour plus de détails techniques, consultez la classe FeatureTogglesConfiguration
.
Il n'existe qu'un seul service déclaré public : le routeur bascule avec TrompetteFeatureTogglesToggleRouter
ou TrompetteFeatureTogglesToggleRouterInterface
comme identifiant.
Il existe également des commandes de console utiles définies comme services et étiquetées avec console.command
:
feature-toggles
feature-toggles:configure-feature Configures a feature
feature-toggles:migrate-dbal-schema Migrates DBAL schema
feature-toggles:show-feature-configuration Shows a feature configuration
Plus d'informations sur les commandes peuvent être trouvées dans leurs messages d'aide.
Pour plus de détails techniques, consultez la classe FeatureTogglesExtension
.
La bibliothèque trompette/feature-toggles
est publiée sous la licence MIT.
Voir le fichier LICENSE pour plus de détails.
La bibliothèque trompette/feature-toggles
s'inspire d'une pratique et d'un outil utilisé par l'équipe de développement de Food Assembly.
L'équipe a découvert cette pratique avec l'article Expérimentation Web avec de nouveaux visiteurs sur le blog d'ingénierie d'Etsy.