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

Features Bundle Laravel Package

serendipity_hq/features-bundle

Serendipity HQ Features Bundle adds a flexible feature-flag system to PHP applications, letting you enable or disable functionality per environment, user, or context. Define features in configuration, check them anywhere, and ship changes safely without redeploying code.

View on GitHub
Deep Wiki
Context7

Technical Evaluation

Architecture fit. The package is a Symfony bundle, not a Laravel package. That distinction is the dominant finding in this evaluation. Bundles are idiomatic to Symfony's runtime: they ship a Bundle class, register services through the Symfony DI container, expose configuration trees via the Config component, and typically hook into the kernel lifecycle (compiler passes, cache warmers, event subscribers). None of that maps onto Laravel's service-provider/kernel model without an adapter layer. A Laravel team cannot composer require this and expect Feature::active()-style ergonomics; there is no FeaturesServiceProvider, no facade, no publishable config, no Blade directive. So the first question is not "does it work?" but "is the underlying domain model separable from the Symfony plumbing?"

What is genuinely valuable here. The domain — plans, features, and the resolution logic that answers "does plan X include feature Y?" — is framework-agnostic in principle and is a recurring need in SaaS billing and entitlement work. If the bundle cleanly separates a manager/service layer from its Symfony wiring, the domain is extractable and portable. If the feature resolution is entangled with DI tags, container parameters, and Symfony event dispatching, extraction becomes a rewrite. That is the single most important thing to determine before committing engineering time.

Integration feasibility. Low as-is for a Laravel codebase; moderate-to-high only if the domain is portable and we are willing to own a small adapter. Practically there are three paths:

  1. Direct use with a bridge — add symfony/* components alongside Laravel and bootstrap the bundle manually. Technically possible; almost certainly the wrong call. You would be maintaining a bespoke Symfony-in-Laravel shim forever, for a dependency with 11 stars.
  2. Domain extraction / fork — pull the plan/feature/resolution logic into a first-party package with a Laravel service provider, config file, and Eloquent (or database-agnostic) persistence. Moderate effort, but it buys a clean seam and full ownership.
  3. Reference implementation only — study the data model and resolution semantics, then adopt a maintained alternative (Laravel Pennant for simple toggles; Flagsmith, Unleash, or LaunchDarkly for plan/entitlement-grade feature management). Lowest cost, lowest risk.

Technical risk. High on several axes:

  • Adoption signal. 11 stars and 0 dependents means essentially no production validation. No dependents is worse than low stars — it means nobody has shipped this and found the edge cases for us.
  • Bus factor. A single-maintainer bundle with a low-traffic repo carries real abandonment risk. MIT licensing means we can fork, but forking means we own it, which must be a deliberate budget line rather than an accident.
  • Framework coupling. Symfony bundle releases track Symfony majors. A Laravel codebase has no Symfony version constraint to negotiate, which sounds freeing but actually means we absorb every breaking change ourselves.
  • Scope ambiguity. "Manage features and plans" spans a wide design space: static config-defined plans, database-backed entitlements, subscription lifecycle hooks, or all three. The fit depends heavily on which of these the bundle actually implements and whether its persistence assumptions match ours.

Key questions for the maintainer / code review. Before any commitment, I would want answers to:

  • Does the bundle ship a framework-agnostic core, or is the resolution logic container-resident? Can it run with symfony/dependency-injection only, or does it require the full kernel?
  • What are the required PHP and Symfony version constraints, and what is the release cadence relative to Symfony's support windows?
  • What is the persistence model — Doctrine entities, config-only, or bring-your-own? Can it be backed by Eloquent/raw SQL without forking internals?
  • What are the extension points for custom resolution rules (e.g. time-boxed trials, seat-count limits, add-ons)? Are they interfaces we can implement, or is behaviour hard-coded?
  • Is there a test suite we can run, and what is its coverage of resolution edge cases?
  • Are plans defined in code/config (deploy to change) or in the database (runtime-editable)? This determines whether product/ops can self-serve.
  • License is MIT — confirm no bundled code with conflicting terms.

Integration Approach

Stack fit. Laravel and Symfony share PHP, Composer, PSR interfaces, and many underlying components, so coexistence is not the problem — idiomatic integration is. A Laravel application expects a package to present: a service provider, a config file merged from config/, container bindings under stable contracts, optional facade, and publishable migrations. This bundle presents none of those. Treat stack fit as conditional: acceptable only behind a thin, first-party adapter that we own and can test independently of the vendor repo.

Migration path. I would sequence this as a spike, not a rollout:

  1. Discovery spike (2–3 days). Clone the repo, read the resolution code, confirm whether a framework-agnostic core exists. Run the existing tests. Produce a one-page verdict on extractability. This is cheap and settles the biggest unknown.
  2. Adapter or extract (1–2 sprints, if the spike is green). Wrap the domain behind a first-party interface — e.g. FeatureResolver::forPlan($planId, $featureKey): bool — with a config-driven or database-driven backend. Keep the vendor package as an internal implementation detail behind that seam, so swapping it out later is a one-file change.
  3. Shadow evaluation. Run the adapter alongside whatever we use today (or alongside a trivial in-house flag) and compare outputs in non-production environments before trusting it for entitlement decisions.

If the spike is not green — which, at 11 stars and zero dependents, is the base case — skip to adopting a maintained alternative and use the bundle only as a data-model reference.

Compatibility. Two compatibility surfaces to pin explicitly: PHP version support (does it run on our runtime, including patch-level behaviour) and Symfony component versions (the bundle will constrain these even inside Laravel, and that constraint lives in our composer.json forever). I would also check for abandoned transitive dependencies, since low-traffic bundles routinely pull in packages that have gone quiet.

Sequencing. Do not build billing or entitlement logic on top of this in the same sprint as the integration. Land the abstraction first, prove resolution correctness with fixtures, then wire it into gating paths. Any place where a wrong answer costs money — plan upgrades, invoice generation, seat limits — should be the last consumer, not the first.

Operational Impact

Maintenance. This is the dominant operational cost and it is easy to understate. Because we are running a Symfony bundle in a Laravel context, we are the de facto maintainers of the integration on day one. That means: tracking upstream commits, re-testing on every Symfony minor, and being prepared to take over the repository entirely if the maintainer steps away. Budget for a named owner and a quarterly review. If we cannot commit to that, we should not adopt it — a low-adoption dependency with no owner inside the org is a slow-motion incident.

Support. There is no vendor to call and no commercial support tier. Escalation is "read the source" or "fork it." That is acceptable for an internal convenience library; it is a poor fit for anything in the revenue path.

Scaling. The package is unlikely to be a throughput bottleneck — plan/feature resolution is a small, cache-friendly lookup, and I would expect it to sit behind a request-scoped or Redis cache regardless of implementation. The real scaling concern is organisational, not technical: as the number of plans, features, and exceptions grows, the model needs runtime editability and an audit trail. If the bundle only supports config-file-defined plans, every pricing change becomes a deploy, which does not scale past a handful of plan tiers. Confirm this before committing.

Failure modes. The ones I would design against:

  • Boot-time failure. A bad config or an incompatible Symfony component patch can break application bootstrap rather than degrade gracefully — worse in a bundle than a library because compilation happens early. Mitigation: instantiate behind a provider that can fall back to a safe default (deny or allow, decided per feature) if resolution throws.
  • Silent wrong answers. A resolution bug that returns false for an entitled customer is a support ticket; one that returns true for an unentitled customer is revenue leakage. Mitigation: assert the resolver's output against a fixture matrix in CI, and log every gating decision with plan, feature, and result for a bounded retention window.
  • Abandonment drift. The package quietly stops receiving Symfony security-adjacent fixes. Mitigation: pin the version, subscribe to releases, and set a review date.
  • Cache staleness. If plan/feature definitions are cached, an out-of-band change may not propagate. Mitigation: explicit invalidation on write, and a versioned cache key.

Ramp-up. Two audiences, different costs. Engineers need enough Symfony literacy to read DI configuration and compiler passes — likely a day or two for a competent PHP developer, but it is friction that never fully goes away. Product and operations need a stable, documented mental model of plans and features; if the bundle's abstractions do not match how the business actually talks about packaging, we will spend the integration budget translating between them. Write the internal docs ourselves — none will arrive from upstream.

Overall recommendation. Treat this as an evaluation candidate, not an adoption. Fund a short, time-boxed spike to determine whether the domain core is separable; do not commit to the Symfony bundle as runtime infrastructure in a Laravel stack. If the spike shows clean separation, fork-and-wrap behind a first-party interface and own it deliberately. If it does not, extract the ideas and adopt a maintained feature-flag or entitlement product. The score of ~5.8 with 11 stars and zero dependents reads correctly to me: interesting domain, weak package posture, and a framework mismatch that shifts the real cost onto us.

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.
robertmarney/lara-hierarchial-collections
simonschaufi/rule-doc-generator
emissaoja/emissaoja
blackbricksoftware/gravityforms-civicrm-form-processor
al-rahabi/fancy-crud
jinas/dhivatar-component
mltstephane/laravel-quality
bernskiold/laravel-talentlms
bernskioldmedia/laravel-form-architect
youbar/easy-crud
c-point-labs/laravel-hostyourai
dbravoan/dbcms-admin-theme-dbcms
dbravoan/dbcms-theme-db-cyber
dbravoan/dbcms-blocks-basic
dbravoan/dbcms-module-content-audit
dbravoan/dbcms-module-ai-assistant
paygate-to/paygate-php
padosoft/askmydocs-connector-base
defstudio/supercharged-carbon
bernskioldmedia/laravel-matomo