Aller au contenu

Référence

phil/feature-flags-bundle

L'API publique par couche. Toutes les classes se trouvent sous Phil\FeatureFlagsBundle\. État : implémenté (testé dans tests/Unit ou tests/Functional), port (une interface que l'application implémente ou peut implémenter), branché (enregistré par le bundle à partir de la configuration).

Domain ne dépend que de phil/ddd-bundle (pour InvalidValue et DomainError) ; Application ajoute psr/clock ; Infrastructure ajoute Doctrine DBAL et ORM, le noyau HTTP et le routage, la console et Twig.

Domain\Flag

TypeRôleÉtat
FlagNameLe nom d'un indicateur : des segments ASCII en minuscules séparés par ., _, -, au plus 100 octets.implémenté
FlagDefinitionUn indicateur tel qu'un fournisseur le connaît : état actif, règles, expérience, métadonnées ; evaluate(), withActive(), readsAnyOf().implémenté
EvaluationLe résultat pour un indicateur et un contexte : activé, raison, code d'erreur, variante ; notFound(), failed().implémenté
EvaluationReasonSTATIC, TARGETING_MATCH, SPLIT, DEFAULT, DISABLED, ERROR (vocabulaire d'OpenFeature).implémenté
EvaluationErrorCodeFLAG_NOT_FOUND, PARSE_ERROR, GENERAL (vocabulaire d'OpenFeature).implémenté
EvaluationContextLes identifiants de locataire, de projet et de sujet, chacun nullable ; of(), anonymous(), get().implémenté
TargetingAttributetenant, project, subject.implémenté
BucketLe compartiment stable 0–99 : of() pour les déploiements progressifs, forVariant() pour les expériences (murmur3a).implémenté
PercentageUn pourcentage entier 0–100 ; admits(Bucket).implémenté
ExperimentDes variantes pondérées sur un attribut ; assign().implémenté
VariantUne branche et son poids 0–100.implémenté
VariantNameLe nom d'une variante, au plus 50 octets.implémenté
FlagMetadataDescription, responsable, genre, date d'expiration ; isExpiredAt().implémenté
FlagKindrelease, experiment, ops, permission.implémenté
FlagProviderUne source de définitions : find().port
EnumerableFlagProviderUn fournisseur qui peut lister ses indicateurs : all().port
DiagnosableFlagProviderUn fournisseur énumérable qui liste aussi les indicateurs qu'il ne peut pas lire : unreadable().port
UnreadableFlagUn indicateur qu'un fournisseur contient sans pouvoir le lire : le nom tel qu'il est stocké et la raison.implémenté
FlagStateSourceUne source d'états actifs : isActive().port

Domain\Flag\Rule

TypeRôleÉtat
RuleUne règle de ciblage : matches(), matchReason(), reads().port
MemberOfCorrespond lorsqu'un attribut fait partie d'un ensemble explicite ; raison TARGETING_MATCH.implémenté
PercentageRolloutCorrespond à une part stable des valeurs d'un attribut ; raison SPLIT.implémenté

Domain\Toggle

TypeRôleÉtat
ToggleReasonUne raison obligatoire, débarrassée des blancs Unicode aux extrémités, d'au plus 1 000 caractères ; BLANK est la classe des caractères blancs.implémenté
ToggleRequestUn acteur qui demande de rendre un indicateur actif ou inactif, avec une raison.implémenté
ToggleRecordLa ligne d'audit d'une bascule appliquée.implémenté

Domain\Edit

TypeRôleÉtat
EditRequestUn acteur qui demande de créer un indicateur (sans révision) ou d'en changer un (avec la révision lue).implémenté
EditRecordLa ligne d'audit d'une création ou d'une modification appliquée, avec les définitions avant et après.implémenté
RevisedDefinitionUne définition stockée et sa révision (au moins 1).implémenté

Domain\Exception

TypeRôleÉtat
ToggleRefusedL'autorisateur a refusé un changement.implémenté
UnknownFlagUne bascule ou une modification a nommé un indicateur qui ne peut pas être changé.implémenté
ToggleConflictUne bascule a perdu une course.implémenté
EditConflictUne révision périmée, une écriture perdue ou un nom déjà déclaré.implémenté

Toutes implémentent Phil\DddBundle\Domain\Exception\DomainError.

Application\Flag

TypeRôleÉtat
FlagEvaluatorÉvalue les indicateurs une fois par requête et par contexte à partir de fournisseurs ordonnés, d'un magasin d'états et d'un enregistreur d'expositions ; definition(), reset().implémenté, branché (kernel.reset)
FlagCatalogLa configuration actuelle : entries(), unreadable(), lookup(), find().implémenté, branché
CatalogEntryUn indicateur avec sa définition déclarée, sa source et son état stocké ; effective().implémenté
UnreadableEntryUn indicateur que le fournisseur qui le déclare ne peut pas lire : nom, raison, source.implémenté
AnonymousContextResolverUn contexte sans attributs.implémenté, branché
EvaluationContextResolverConstruit le contexte de la requête courante.port
ExposureRecorderCompte les expositions A/B par indicateur et par variante.port

Application\Toggle

TypeRôleÉtat
FlagTogglerLa bascule auditée : autoriser, lire, auditer, écrire (comparaison-échange ou première insertion).implémenté, branché avec toggle
ToggleAuthorizerDécide des bascules, des créations et des modifications.port
ToggleAuditorÉcrit la ligne d'audit de chaque changement.port
WritableFlagStoreUn magasin d'états où écrit une bascule : compareAndSet(), insert().port

Application\Edit

TypeRôleÉtat
FlagEditorLa création et la modification auditées, conditionnelles à la révision.implémenté, branché avec toggle et un magasin de définitions
WritableFlagDefinitionsLes définitions où écrit l'administration : findRevised(), create(), replace().port

Application\Admin

TypeRôleÉtat
ActorProviderL'opérateur des écrans d'administration.port

Application\Circuit

TypeRôleÉtat
FlagCircuitOverrideLe CircuitOverride de phil/circuit-breaker : force l'ouverture d'un circuit tant que circuit-open.<key> est activé ; flagFor(), FORCE_OPEN_FLAG_PREFIX.implémenté, branché et étiqueté phil_circuit_breaker.override

Infrastructure\Configuration

TypeRôleÉtat
ConfiguredFlagProviderLes indicateurs de phil_feature_flags.flags, plus l'indicateur d'ouverture forcée de chaque circuit ; énumérable.implémenté, branché
FlagDefinitionFormatLa forme de tableau unique d'un indicateur, lue à partir de la configuration, des rangées de la base de données et des formulaires d'administration, et réécrite dans les deux derniers.implémenté

Infrastructure\Doctrine

TypeRôleÉtat
DoctrineFlagDefinitionsLes indicateurs créés dans l'administration, dans phil_feature_flags_definition : fournisseur diagnosticable (une rangée illisible donne PARSE_ERROR et est listée avec sa raison) et définitions modifiables.implémenté, testé sur SQLite, MySQL et PostgreSQL, branché avec doctrine
DoctrineFlagStoreLes états actifs dans phil_feature_flags_state.implémenté, testé, branché avec doctrine
FlagSchemaListenerAjoute les tables au schéma généré par l'ORM.implémenté, testé, branché avec doctrine
FlagTablesLes noms des tables et configure(Schema).implémenté

Infrastructure\Http

TypeRôleÉtat
IsFeatureEnabledAttribut de contrôleur : 404 tant que l'indicateur est désactivé ou hors de la variante.implémenté
FeatureGateListenerFait respecter IsFeatureEnabled sur kernel.controller.implémenté, branché
FlagAdminControllerLes écrans d'administration : list, show, toggle, create, edit.implémenté, branché avec admin
SameOriginGuardRefuse les envois de formulaire intersites selon Sec-Fetch-Site ou Origin.implémenté

Infrastructure\Routing, Twig, Console

TypeRôleÉtat
Routing\FlagRoutingConditionservice('feature_flags') dans les conditions de route : enabled(), variant() ; refuse un indicateur qui cible des sujets ou des locataires.implémenté, branché
Routing\FlagNotRoutableLancée par une condition de route qui lit un indicateur ciblant des sujets ou des locataires.implémenté
Twig\FeatureFlagsExtensionfeature_enabled() et feature_variant().implémenté, branché
Console\ListFlagsCommandphil:feature-flags:list.implémenté, branché

Infrastructure\DependencyInjection

TypeRôleÉtat
ForceOpenFlagsPassDonne au fournisseur de configuration les clés des circuits de phil/circuit-breaker-bundle, pour que chacun déclare son indicateur d'ouverture forcée.implémenté, ajouté par le bundle

Bundle

TypeRôleÉtat
PhilFeatureFlagsBundleL'arbre de configuration (alias phil_feature_flags), la validation à la construction, le câblage ; les constantes d'identifiants de service.implémenté, testé

Ressources

CheminRôle
config/routes/admin.phpLes cinq routes d'administration.
templates/admin/layout.html.twigLa mise en page par défaut (blocs title et content).
templates/admin/list.html.twig, show.html.twig, form.html.twigLes écrans d'administration.