fsi/resource-repository-bundle
A Symfony bundle that integrates FSi's resource repository library, offering reusable repository services for Doctrine entities with built-in CRUD, pagination, and filtering to reduce boilerplate and keep persistence logic out of controllers.
Architecture fit. fsi/resource-repository-bundle is a Symfony bundle, not a Laravel package. That is the single most important fact for this evaluation, and release 4.0.3 does not change it. It ships a Bundle subclass, a DI extension, Doctrine ORM entity mappings, form types, and Twig helpers — none of which have a native entry point in a Laravel application. The pattern it implements (typed key-value resource storage with a repository facade and a cache decorator) is useful and fits almost any stack. The artifact does not fit ours without a translation layer.
The domain model is thin and well-understood: a resource table keyed by a string name, with typed value variants (text, integer, boolean, date, file) and a repository exposing get/set/has with caching on read. That maps cleanly onto an Eloquent model plus a repository class plus a cache decorator — roughly 150–300 lines.
Integration feasibility. Two paths:
ServiceProvider, and bringing in laravel-doctrine/orm (or equivalent) so the bundle's entity mappings and EntityManager dependencies resolve. That adds Doctrine ORM as a second persistence stack alongside Eloquent, permanently.Path 2 is the recommendation. Path 1 is only defensible if we already run Doctrine ORM, which we do not.
Technical risk.
@chives as the fixing contributor, which is the first concrete maintainer attribution we have — useful, but one handle on one PR is not a stewardship signal.Key questions.
@chives the maintainer of record, a drive-by contributor, or a colleague of the commercial owner — and what is the commit cadence over the last 12 months?doctrine:schema:update?Stack fit. Poor as a dependency, good as a design reference. Our stack is Laravel + Eloquent + Laravel Cache. The bundle assumes Symfony DI, Doctrine ORM, Symfony Forms, and Twig. We would use none of those in the adopting path except Doctrine, which we would be introducing solely to satisfy the dependency.
Recommended path: pattern port, not package install.
ResourceRepository with get(string $key, mixed $default = null), set(string $key, mixed $value), has(string $key), forget(string $key).resources table: key unique index, type, value JSON or text, timestamps).Cache::remember / Cache::forget with a versioned key prefix so a full flush is a prefix bump rather than a scan.Migration path. There is no data migration from the bundle because we are not running it. If a future decision reverses this, the resources table shape above is close enough to the bundle's schema that a one-time key/type/value copy is a scripted afternoon, not a project.
Compatibility. The port has no framework-version coupling beyond Laravel itself, which we already track. Cache backend compatibility is whatever Laravel supports natively (Redis, database, file, array) — no adapter layer needed. If Doctrine ORM is ever introduced for unrelated reasons, reconsider adoption then, and only against a version whose patch history we have reviewed.
Sequencing. Unchanged by 4.0.3:
Total: roughly one engineer-week. That is less than the cost of evaluating, wiring, and supporting the Doctrine bridge the bundle would require.
Maintenance. Under the port, we own ~250 lines and its tests — a low, predictable maintenance load with no external upgrade pressure. Under adoption, we inherit a third-party Symfony bundle plus a Doctrine-in-Laravel bridge; two independent upgrade dependencies for one small capability. The bundle's 3-star, 0-dependent profile means we are effectively the maintainer of record the moment we depend on it — and 4.0.3 reinforces this: the fix landed, but only because someone upstream noticed. Price that in rather than discover it.
Support. No commercial support, no SLA, no security response process we can rely on. With MIT licensing we retain the fork option, which is the only real support guarantee here. The 4.0.3 changelog is a single line with no root-cause detail, so we cannot even assess blast radius of the 4.0.1 regression from the release notes alone. If we adopt: pin an exact version, vendor the source into review scope, require the PR diff and test added alongside any upgrade, and treat upstream changes as something we pull deliberately, never automatically.
Scaling. The underlying model scales fine — one indexed row per key, O(1) point lookups, cache absorbs the read load. Three things to watch:
Cache::remember with a short lock or accept the warm-up spike for known-critical keys.Failure modes.
null returned for both "absent" and "explicitly null" is a silent bug generator. Make the contract explicit and test it.composer update with no warning. Auto-upgrade is not safe with this package; pin, and diff the source between tags before bumping.Ramp-up. Under the port, a Laravel developer is productive in under an hour: the interface is four methods and the semantics are documented in our repo. Under adoption, ramp-up means teaching the team Symfony bundle conventions, Doctrine entity mapping, and the bridge configuration — a day or more of context per engineer, for a component whose entire behavior fits on one page.
Bottom line. 4.0.3 is a one-line bugfix for a regression introduced two patches earlier. It is a maintenance signal, not a capability change: it confirms the package is alive but also confirms that patch tags are not inherently safe and that defect discovery depends on the maintainers noticing. Do not take the dependency. The bundle is competently scoped but is a Symfony artifact with no adoption evidence and no Laravel path, and the capability it provides is small enough to own outright in a week. Use it as a specification, port the pattern, and keep the option to reconsider open only if Doctrine ORM enters the stack for other reasons.
How can I help you explore Laravel packages today?