flagception/flagception-bundle
A Symfony bundle for feature flags and toggles. Define flags, activate them by context or constraints, and check them in controllers, services, Twig templates, and annotations. Integrates Flagception with Symfony configuration and dependency injection.
Architecture fit — the framing is wrong, and the 6.1.1 release confirms it. flagception/flagception-bundle is a Symfony bundle, not a Laravel package. Its value is entirely in Symfony integration surfaces: a DependencyInjection extension exposing a flagception: config tree, compiler passes that register activators, a Twig extension (feature() helper), a @Feature annotation/attribute guard, a console debug command, and a Web Profiler panel. None of that has a counterpart in Laravel — there is no bundle system, no config-tree compiler, no annotation-driven security layer. In a Laravel app this package would sit inert unless we deliberately pulled in symfony/dependency-injection and symfony/http-kernel, which is a non-starter for a normal application.
What 6.1.1 actually changed. Two items, both Symfony-side only. (1) symfony/5.4 restored to the CI test matrix — a build-config change with zero runtime surface. (2) RouteMetadataSubscriber now shows which features are inactive — this is a Symfony HttpKernel event subscriber that annotates route metadata for debugging. It is a small, genuinely useful observability improvement, and it is also the clearest possible evidence of the point above: the project's forward investment is going into Symfony request-lifecycle introspection, a layer Laravel does not have and would not use. Nothing in this release touches flagception/flagception, the core evaluator — the only part we would consume.
What is actually reusable: the underlying flagception/flagception core library, which the bundle decorates. That layer is framework-agnostic and portable: a FeatureManager façade, a request Context, and a chain of pluggable activators (expression-based, cookie, query-string, environment, date/time windowing) plus a PSR-16 cache. That evaluator model — composable, ordered, cache-aware — maps cleanly onto a Laravel service provider + facade + Blade directive. The bundle, however, is the part we'd have to throw away, and 6.1.1 widens exactly that throwaway portion.
Integration feasibility: feasible at roughly one to two engineer-weeks for the glue, if we scope to the core library. Bind FeatureManagerInterface as a singleton, publish a config file mirroring the activator list, hydrate Context in a middleware, cache via Illuminate\Cache\Repository (which already satisfies PSR-16), and expose a @feature Blade directive. The expression activator drags in symfony/expression-language — usable standalone, but it's a second Symfony dependency in a Laravel tree and a per-evaluation cost we must budget. 6.1.1 does not change any of this.
Technical risk: low on code integrity, moderate-to-high on everything else.
0 dependents and 30 stars is still a hard signal: no downstream production validation, no Laravel-community usage to learn from, no third-party bug reports covering our stack. We would be the first.@rpkamp, so the contributor base is no longer exactly one person, and the 6.1.0 → 6.1.1 sequence is evidence of a live, versioned release line rather than a dormant repo. That partially retires the release-date anomaly flagged in the prior assessment. It does not retire the underlying concern: the project is still vendor-led (PlayOX), still effectively single-maintainer at the core, and still has no ecosystem behind it. Two contributors on a 30-star package is a slightly better signal, not a good one.symfony/5.4 test-matrix addition signals a "support the old LTS range" posture. Good for Symfony shops on legacy versions; irrelevant to us, and mildly indicative that modernization energy is finite.13.78 with opportunity 53.3 reads as "interesting niche, unproven execution" — still consistent with what the repo actually is, and a patch release shouldn't move a score of that shape.Key questions for the vendor/owner:
flagception/flagception. Commit cadence over the last 12 months on that repo, open-issue age, PHP 8.3/8.4 support in its composer.json.Stack fit. Target Laravel 10/11/12 on PHP 8.2+. Consume flagception/flagception only; explicitly do not require flagception/flagception-bundle, and document that decision in the ADR so the next engineer doesn't "helpfully" add it. The 6.1.1 changelog is a useful artifact to paste into that ADR as evidence: both merged PRs are Symfony-only, which pre-empts the "it looks actively maintained, let's just install it" argument.
Recommended layering — protect the blast radius. Introduce an internal FeatureFlags contract with a single isActive(string $flag, array $context = []): bool. Implement it first as a thin config/env reader, then swap in Flagception behind the same interface. This is the single most valuable decision here: it makes the vendor choice reversible, and it means the day-1 delivery doesn't hinge on a 30-star package. Note that 6.1.1's observability improvement (route-level active/inactive feature visibility) is functionality we would otherwise want — it should be captured as a requirement on our own artisan flags:debug command, not as a reason to pull in the bundle.
Compatibility notes:
composer update --dry-run against the app's existing Symfony transitive dependencies early. The symfony/expression-language and symfony/* version ranges are the likely friction point. The renewed symfony/5.4 CI entry is a reminder that the bundle's own matrix is Symfony-version-shaped and tells us nothing about coexistence with a Laravel tree.Sequencing:
FeatureFlags contract + config-driven default implementation, no third-party dependency.artisan flags:debug, then migration of existing env-flag checks.Maintenance — we own the glue, permanently. Every Laravel-specific piece (provider, facade, Blade directive, middleware, job context handling, debug command) is code we write and maintain; there is no upstream to inherit it from, and 6.1.1 delivered nothing into that column. Budget a recurring 2–4 hours/month for dependency bumps and Symfony transitive-version drift, and expect zero upstream support for Laravel-shaped issues. The bundle's release cadence is irrelevant to us because we won't ship it — the practical consequence of 6.1.1 is that a project we don't depend on got slightly better at a job we don't have.
Support posture. MIT, community-only, vendor-led. There is no escalation path. 6.1.1 is mild positive evidence on liveness — a new external contributor, a clean patch tag — but it does not create a support contract, and the core library's health remains unproven. Mitigation is unchanged and is the whole argument: the FeatureFlags contract means an abandonment event is a one-implementation swap, not a refactor. State that explicitly in the recommendation rather than implying it.
Scaling. Evaluation is in-process and cheap for the array/environment activators; the expression activator is the cost centre — per-evaluation parsing is avoided if expressions compile once, but verify. Two specifics that bite at scale:
FeatureManager holding a resolved flag map will serve stale values across requests in a resident-worker runtime. Flag state must be request-scoped or refreshed on a short TTL, and this is a Laravel-specific failure mode that has no upstream documentation — it will be discovered the hard way if not designed for.Failure modes to define before launch:
artisan flags:debug ourselves, and it's worth it.Ramp-up. Low for any mid-level Laravel engineer on the abstraction layer, because the surface is one method. Higher for the person who owns the evaluator internals, who must learn Flagception's activator ordering, expression semantics, and cache contract from source — there is no Laravel-oriented documentation and no community examples to lean on, and recent upstream work will not generate any. Assume one engineer at ~60% for two weeks to reach confident ownership, and require internal documentation as a deliverable rather than a follow-up.
Bottom line. Unchanged by 6.1.1. Do not adopt flagception/flagception-bundle in a Laravel codebase — it is a Symfony integration layer with no Laravel integration points, 30 stars, and zero dependents, and its latest release invests solely in Symfony request-lifecycle debugging. If ordered activator chains and expression targeting are genuinely required, consume the core flagception/flagception library behind an internal FeatureFlags contract and treat the vendor as replaceable. If simple boolean/segment flags are sufficient, Laravel Pennant removes this risk entirely at zero dependency cost.
How can I help you explore Laravel packages today?