Weave Code
Weaver
Helps Laravel developers discover, compare, and choose open-source packages. See popularity, security, maintainers, and scores at a glance to make better decisions.
Feedback
Share your thoughts, report bugs, or suggest improvements.
Subject
Message

Flagception Bundle Laravel Package

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.

View on GitHub
Deep Wiki
Context7

Technical Evaluation

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.

  • License is MIT — clean for commercial use, no legal review burden.
  • 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.
  • Bus factor — marginally improved. 6.1.1 ships a first contribution from @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.
  • The 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.
  • Score 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:

  1. Do you need a Symfony-style bundle specifically, or just runtime feature evaluation? If the latter, the bundle is dead weight — and 6.1.1's headline feature is dead weight for us by construction.
  2. What is the real maintenance signal on the upstream core library specifically? 6.1.1 proves the bundle is alive; it says nothing about 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.
  3. Have you already evaluated Laravel Pennant (first-party, ships with Laravel 11+) or an external service (Unleash, Flagsmith, LaunchDarkly)? What does Flagception give us that Pennant does not — the answer is likely ordered activator chains and expression-based targeting, which is a real but narrow delta.
  4. What is the fail-open/fail-closed expectation when an activator throws or the cache backend is unavailable?
  5. Is this a long-lived platform decision or a two-quarter experiment with a defined exit?

Integration Approach

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:

  • No Laravel version constraints exist upstream, so Composer's conflict resolution in our tree is untested — pin exact versions and run a full 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.
  • Cache: bridge Laravel's repository to PSR-16 rather than introducing a second cache client.
  • Context hydration belongs in middleware for HTTP and in a job middleware/base class for queue workers — do not assume HTTP-only.

Sequencing:

  1. Spike (3–5 days): wire the core library into a throwaway branch, evaluate expression activators, and benchmark evaluation cost under a realistic flag count. Confirm the Symfony dependency tree is acceptable.
  2. Abstraction (3 days): land the FeatureFlags contract + config-driven default implementation, no third-party dependency.
  3. Pilot (1 week): one non-critical, non-revenue flag through the full path, including cache and context.
  4. Widen: queue/console context handling, then the Blade directive, then artisan flags:debug, then migration of existing env-flag checks.
  5. Decision gate: at ~30 days, compare against Pennant on developer ergonomics; keep Flagception only if the activator-chain model is genuinely earning its keep.

Operational Impact

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:

  • Cold-start stampede. A flushed or expired flag cache means every request re-evaluates and re-warms. Add jitter to TTLs and a request-scoped memo layer in front of the shared cache.
  • Octane / long-lived workers. A singleton 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:

  • Activator throws → fail-open or fail-closed? Default must be explicit per-flag, not global.
  • Cache backend unavailable → degrade to in-process evaluation, never to an unhandled exception on the request path.
  • Context not hydrated (queue job, artisan command, scheduler) → flags silently evaluate against an empty context. This is the most likely real-world incident and needs a loud log, not a silent default.
  • Stale flag after removal → orphaned flag keys drifting in code. Enforce a naming convention plus a periodic audit. The bundle's debug command still has no Laravel equivalent, and 6.1.1's route-metadata improvement only deepens that gap — we build 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.

Weaver

How can I help you explore Laravel packages today?

Conversation history is not saved when not logged in.
Prompt
Add packages to context
No packages found.
pharaonic/laravel-notification-dependencies
beautinow/translug
dev-brainiac/bot-cloaked
octoberrain/html
octoberrain/extension
octoberrain/exception
octoberrain/contracts
frankyso/ipaymu
3mdikram/worldmoneywords
snowsoft/config
itmosoft/laravel-subscriptions
larva/laravel-ai-qwen
adachsoft/api-version-bundle
cgv/localized-resource
noith/settings
kda/laravel-package
kda/filament-dynamic-navigation
bypersoft/signbox
pairus/product-data
fayne/laravel-filament-cms-core