smirik/config-bundle
Symfony bundle for managing application configuration from the database. Provides Doctrine-backed settings storage, a service for reading and writing config values, caching, and integration with Symfony services and templates so runtime options can change without code deployments.
Architecture fit — poor, and this is the headline finding. Despite being catalogued in this Laravel/PHP review track, smirik/config-bundle is a Symfony bundle (Smirik\ConfigBundle), not a Laravel package. It follows Symfony conventions: a DependencyInjection extension, YAML/XML service definitions under Resources/config, and configuration merged through the container parameter bag. Laravel has no bundle concept, no compiler passes, and no container-parameter config merge semantics of this kind. It cannot be composer required into a Laravel application and expected to work; there is no service provider, no auto-discovery, no facade, and no framework hook.
What the bundle actually does is narrow and reproducible: store key/value configuration rows in the database, type-cast them, expose them through a service (with a Twig helper), layer defaults against environment-specific overrides, and cache reads. That is a well-understood pattern, and Laravel already provides the primitives — config/*.php, env(), config:cache, and Repository — to build it in a few days.
Integration feasibility — low without deliberate engineering. The realistic integration paths are (a) treat it as a design reference and reimplement natively on Eloquent + Cache::remember, (b) mount it inside a legacy Symfony application you happen to be integrating with, or (c) skip it. Any "adapter" that reimplements the bundle's merge logic inside a Laravel service provider is, functionally, a rewrite — at which point the dependency has added cost without adding capability.
Technical risk — high, and dominated by provenance rather than code quality.
symfony/* to 2.x/3.x and PHP to 5.x–7.x. That conflicts directly with Laravel 9+ (PHP 8.0+, modern Symfony components), producing Composer solver deadlock or a force-install with an untested dependency graph.Key questions to resolve before any further spend:
composer.json require constraints for PHP and Symfony?Absent satisfactory answers, the TPM recommendation is do not adopt. The package is valuable to us as a design reference for a DB-backed settings layer, not as a dependency.
Stack fit — poor. This is a Symfony-first artefact being evaluated against a Laravel estate. The idiomatic Laravel equivalents already exist as first-party behaviour (config/*.php, env(), config:cache) or as maintained packages (spatie/laravel-settings, or a custom Repository backing config() with a database or remote store). Recommending a foreign bundle inserts a translation layer with no offsetting benefit and creates permanent cognitive overhead for every engineer who touches config.
Migration path — two options, in preference order:
Illuminate\Config\Repository or a settings service. Estimated 3–5 engineer-days. The team owns and understands the result, and the dependency graph stays clean.Smirik\ConfigBundle\* directly. This contains blast radius if upstream disappears, which, given zero dependents, is the expected outcome.Compatibility assessment. Run composer why-not against the target Laravel and PHP versions as the first gate. Expect conflicts. If the bundle requires symfony/http-kernel 2.x/3.x it is incompatible with Laravel 9+ by construction; --ignore-platform-reqs is not an acceptable mitigation for anything reaching production.
Sequencing — gated, with a cheap exit at each step:
Maintenance — effectively total ownership. With no maintainer activity and no dependents, the adopting team becomes the de facto owner of the code, including tracking Symfony and Laravel security releases it has not been updated against. That recurring cost is the real price, not the integration sprint; budget it explicitly in any business case.
Support — none. No vendor, no SLA, no community to escalate to. The internal escalation path must terminate in the adopting team, which means the team must be able to read and modify the source. This is a strong argument for fork-and-pin over a straight dependency, and a stronger argument for not adopting at all at this scope.
Scaling — must be re-validated, not assumed. Config sits on the hot path of every request in Laravel (read at boot and on every config() call). Any solution introducing a database or network read into resolution must be paired with config caching and careful invalidation. A Symfony parameter-bag design likely assumes config resolves at container compile time — a model that does not map onto Laravel's per-request boot. Watch for unbounded config growth and cache stampedes on deploy.
Failure modes:
array_merge-based loading; misunderstood precedence yields wrong runtime values rather than an error — the worst class of config bug.Ramp-up — real and non-transferable. The team is Laravel-idiomatic and would need to acquire Symfony bundle mechanics — compiler passes, extension load() methods, parameter resolution order — to operate this package. That investment produces knowledge applicable to exactly one unmaintained dependency and does not improve throughput elsewhere. Estimate several days of senior engineering time before the first safe production change, versus hours for the native alternative.
TPM recommendation. Do not integrate. Use the package's design as a reference, reimplement the required behaviour natively (3–5 engineer-days, fully owned), or select a maintained Laravel-native settings package. Revisit only if Gate 0 unexpectedly demonstrates a capability gap that cannot be closed in-house within that estimate.
How can I help you explore Laravel packages today?