novaway/feature-flag-bundle
Novaway FeatureFlagBundle is a Symfony bundle for defining and toggling feature flags via configuration, annotations, and Twig. It supports strategy-based activation, gradual rollouts, and safer releases without redeploying.
Architecture fit. novaway/feature-flag-bundle is a Symfony bundle, not a Laravel package — the first thing to resolve before this goes on any backlog. It ships a FeatureFlagManager service and a Twig helper around a YAML/PHP configuration file, following the "KISS" premise in its description. That design assumes a Symfony DI container and bundle registration lifecycle. Our stack is Laravel, so the bundle's wiring (extension classes, service definitions, compiler passes) is inert outside Symfony; only the underlying PHP classes could be reused, and even then only by manually binding them into Laravel's container. Architecture fit for a Laravel application is therefore low-to-moderate: the concept fits, the package does not.
Integration feasibility. If the target is a Symfony service, integration is trivial — install, register the bundle, define flags in config, inject the manager. If the target is Laravel, expect to write an adapter: a service provider that constructs the manager from config/feature_flags.php, plus a Blade directive mirroring the Twig function. That is a day of work, not weeks, but it is work we own forever and that upstream will never test. A framework-native option (Laravel Pennant for simple cases, Unleash or LaunchDarkly for targeting and audit) removes that tax.
Technical risk. The dominant risk is the configuration-driven model itself. Flags defined in a versioned config file require a deploy to flip, which negates the primary operational value of feature flagging: decoupling release from deploy, and instant kill switches during an incident. Secondary risks: 25 stars and zero dependents is a very weak adoption signal, meaning no community safety net and effectively no signal that the edge cases we hit have been hit before; a single-maintainer project carries bus-factor risk. Mitigating factors: MIT license, an actively recent release (Nov 2025), and a small, auditable codebase — forking or vendoring is genuinely cheap here.
Key questions.
Stack fit. Treat this as "adopt only in a Symfony context, otherwise borrow the pattern, not the package." The abstraction is thin enough that reimplementing it in Laravel — a config file, a manager class with isEnabled(), a Blade directive, and a cache layer — is perhaps 150 lines and fully under our control. That is a better outcome than an adapter shim around a bundle whose lifecycle we do not participate in.
Migration path. If we adopt for Symfony: composer require, register the bundle in bundles.php, publish/author the flag config, replace any hardcoded booleans or ad-hoc env() checks with manager calls, and add a Twig extension usage where templates branch on features. If we are on Laravel: skip adoption; stand up Laravel Pennant for simple boolean flags, and only escalate to a hosted provider when targeting rules or audit become requirements. If we already have scattered if (config('features.x')) checks, the migration is mechanical regardless of which backend wins — the interface is the same shape.
Compatibility. Verify the PHP constraint against our runtime (8.1/8.2/8.3) and, for the Symfony path, confirm the supported Symfony major versions — bundle compatibility tends to lag framework majors by one release. Flag config format should be pinned in a schema or validated at boot so typos fail loudly rather than silently defaulting to "disabled" in production.
Sequencing.
FeatureFlags interface in our own namespace — this is the real deliverable, because it lets us swap the backend later without touching call sites.Maintenance. Low absolute code surface, but concentrated in one maintainer with no downstream dependents. Budget for periodic fork health checks; if upstream goes quiet, a vendored copy is a few hundred lines and we can carry it. The framework-mismatch adapter (Laravel scenario) is the real ongoing cost — it is untested glue that breaks silently on our own refactors.
Support. No vendor, no SLA, community-issue-only support. Internal documentation and a named owner are mandatory. Onboarding note: "KISS" means fewer concepts to learn but also fewer guardrails — there is no validation, no dashboard, no audit trail unless we build it.
Scaling. File-based flag evaluation is effectively free at runtime and scales fine for boolean and static-variant flags; add a cache layer if the config parse sits on a hot path. It does not scale organizationally: no per-environment UI, no targeting, no gradual rollout, no experiment metrics. Once more than a couple of teams or more than roughly a dozen flags are involved, the config file becomes a merge-conflict hotspot and flag drift between environments becomes a real source of "works in staging" incidents.
Failure modes.
Ramp-up. Very low for a Symfony developer — an hour to read the source and understand the model. Near-zero for a Laravel developer using Pennant instead. The learning cost is not the code; it is the discipline of flag hygiene (naming, ownership, expiry, cleanup), which no package in this tier enforces.
Recommendation. Do not adopt for a Laravel application. If the target is Symfony and requirements are genuinely limited to static, deploy-time booleans, this is a defensible low-cost choice — vendor it rather than depend on it. If runtime control, targeting, or audit are on the roadmap within two quarters, skip this tier entirely and go to Pennant (Laravel) or a hosted provider; retrofitting runtime control onto a config-file flag system costs more than starting there.
How can I help you explore Laravel packages today?