hexanet/settings-bundle
hexanet/settings-bundle provides persistent, database-backed key-value settings for PHP applications. Store, retrieve, and update configuration values at runtime through a simple API, with support for typed values and defaults—so settings stay editable without redeploying code.
Architecture fit — mismatch, now confirmed explicitly by the release. hexanet/settings-bundle is a Symfony bundle, and v2.0.0 removes any ambiguity: the changelog's first line is "Only support Symfony >= 3.4." This is not a Laravel/PHP package with a Symfony flavor; it is a Symfony-only artifact by design intent. Its distribution model (bundle class, DI extension, service-oriented configuration) remains structurally incompatible with Laravel's service provider / facade / config-repository idioms. Adopting it in a Laravel codebase still means either standing up a Symfony kernel component inside Laravel (untenable) or hand-porting the internal logic — at which point you are no longer adopting the package. Even in a Symfony context the fit remains weak, and the release makes it weaker rather than stronger: raising the floor to Symfony 3.4 targets a line that reached end-of-life in November 2019. A major version published to modernize DI while still pinning to an EOL framework generation is a signal that this package is not tracking the framework it depends on.
Integration feasibility — still effectively zero for Laravel, low for Symfony. The prior signals hold, with two amendments:
Technical risk — high on every axis, with a new upgrade-surface risk introduced by v2.0.0. A settings subsystem sits on the read path of nearly every request and often the write path of admin operations; acquiring that component from an unmaintained source means inheriting unowned code where correctness and cache coherence matter most. The release adds specific new risk:
Specific risk areas to probe remain: how values are typed and serialized (scalar-only vs. structured), whether there is a cache layer and how invalidation is handled across processes, whether multi-tenant scoping exists, and whether writes are transactional. None are documented, and undocumented behavior in a settings layer is a silent-corruption vector.
Key questions for the review gate:
Stack fit — do not integrate as-is. For a Laravel stack the recommendation is unchanged: reject and substitute. The maintained, idiomatic peer remains spatie/laravel-settings (typed settings classes, migrations, cached, Laravel-native). For Symfony, use the framework's own parameter/config layers plus Doctrine, or a maintained bundle. v2.0.0 does not create a Laravel path and does not make the Symfony path more attractive. This package should be treated as reference material — design ideas to read, not a dependency to install.
Migration path, if the package is already in use. Treat as a strangler-fig extraction, and note that v2.0.0 adds a decision to the front of it:
SettingsRepository in the application's own namespace, backed first by the legacy store and the new store simultaneously; read from legacy, assert equality.Compatibility. Unchanged guidance: do not attempt to install against current Laravel or Symfony majors without a dependency-resolution spike first. Expect constraint conflicts; the realistic outcome is a fork with widened constraints and no upstream to rebase onto. v2.0.0's explicit Symfony >= 3.4 floor is a useful data point for that spike — if your runtime is above 3.4, the release tells you the package has not been validated there.
Sequencing. Order by risk retirement, not feature completeness: (1) confirm the Laravel-vs-Symfony question and terminate early if Laravel — the release now settles this; (2) if Symfony, run a one-day dependency-resolution and boot spike against both v1 and v2 to see which (if either) resolves; this single gate kills or confirms the option cheaply; (3) only then evaluate extraction of specific logic versus clean reimplementation; (4) schedule the substitute component as its own deliverable with tests, not as a rider on a feature release.
Maintenance — perpetual, uncompensated ownership. Archival converts a dependency into a fork. Assume you own security patching, framework-major upgrades, PHP-version compatibility, and all bug fixes. v2.0.0 does not offset this; it demonstrates the opposite — a single modernization commit against an EOL framework line, with breaking DI changes and no functional work. A settings layer is touched on nearly every request, so it will be among the first things to break on any runtime upgrade.
Support — none. No maintainer response, no issue-tracker triage, no CVE feed. A fresh major version tag on an archived repository creates a specific support hazard: it looks maintained to a casual reviewer while offering no escalation path. Document the v2.0.0 provenance in your rationale so the tag does not get cited later as evidence of health. Institutional knowledge risk is acute: whoever performs the investigation becomes a single point of failure unless findings are written down.
Scaling — unproven and likely naive. With 0 dependents there is no evidence of production load. Probe specifically for cache strategy (per-request memoization vs. shared cache vs. none), N+1 patterns when resolving multiple settings, and invalidation semantics across multiple app servers. A settings system that reads from the database per key will not survive a high-throughput read path, and a cache without cross-process invalidation produces stale-value bugs that are extremely expensive to diagnose in production.
Failure modes to plan for:
Ramp-up — moderate investigation, low reuse. Reading and understanding the package is roughly 0.5–1 day for a senior engineer, plus a short delta to understand the autowiring change and its effect on any service overrides. Building a replacement with tests is on the order of 1–2 weeks depending on tenant scoping and cache requirements. Ramp-up yields no reusable upstream contribution, which is why the opportunity score is low.
Recommendation. Do not adopt. v2.0.0 does not change the verdict; it strengthens it. Close the evaluation with a written rationale — archived, zero adoption, Symfony-only by explicit declaration, raised floor to an EOL framework line, breaking DI change with no functional improvement — and redirect the effort to a maintained alternative or a small in-house settings service. Reserve fork-and-extract only for the case where the package is already embedded in a live Symfony system and a specific piece of its resolution logic is genuinely non-trivial; even then, cap the investigation at a one-day spike with an explicit kill criterion.
How can I help you explore Laravel packages today?