idci/simple-metadata-bundle
A small Symfony bundle for attaching simple metadata to your objects, letting you store extra key-value data alongside entities without schema changes. Lightweight and easy to wire into existing projects, though it has minimal adoption and may need review before production use.
What this is: idci/simple-metadata-bundle is a Symfony2 bundle that attaches arbitrary key/value metadata to Doctrine entities via a polymorphic side table and a service layer. It is not a Laravel package — no service provider, no facade, no publishable config, no Eloquent integration. For a TPM, the evaluation is less "does it fit" and more "what decision does it inform."
Architecture fit — none as a dependency. A Symfony bundle extends through a Bundle class, a DI extension, and YAML/XML service wiring loaded at kernel boot. Laravel has no equivalent boot path; the bundle's integration surface would be inert even if it installed. The only reusable asset is the pattern — a metadata side table keyed by (metable_type, metable_id, key) plus a trait exposing get/set/remove. That pattern is what a TPM should carry forward; the code is not.
Integration feasibility — low, and a port is a rewrite in disguise. Expect Symfony2-era composer.json constraints (PHP 5.6/7.0, symfony/* ^2.x, Doctrine ORM/DBAL of that vintage) that hard-conflict with Laravel 9+ (PHP 8.0+). Forcing resolution with --ignore-platform-reqs produces a package that will fatal on PHP 8 removed APIs. Realistic extraction effort for anything framework-agnostic: 3–10 engineering days, with a genuine chance the answer is "nothing salvageable." A clean Laravel-native rebuild is 1–3 days.
Technical risk — high and asymmetric. Symfony2 reached EOL in November 2018; there is no security patch path. Two stars and zero dependents mean no community validation, no downstream fixes, and no evidence the abstractions survive production. The composite score of 0.01 and opportunity: 17.66 corroborate a dormant artifact. The MIT license is the single clean positive — reuse and forking are legally unencumbered, which is precisely what makes the "build it ourselves" path cheap.
Key questions a TPM should force in a ≤4-hour spike (assigned to an engineer, not answered in a meeting):
spatie/laravel-schemaless-attributes, a JSON column with an Eloquent cast, or a small polymorphic table + HasMetadata trait) sufficient in less time?TPM judgment: the package's value to us is as prior art and a stakeholder argument, not as a line item in composer.json.
Stack fit — no dependency path. There is no viable composer require. State this plainly in any planning doc so it doesn't resurface as a "quick win" later.
Migration path — reimplement natively (default), or vendor-and-port (exception).
metadata table (metable_type, metable_id, key, value, type, timestamps, composite index on (metable_type, metable_id, key)), a HasMetadata trait with setMetadata/getMetadata/scopeWhereMetadata, a Metadata Eloquent model with a morph-to relation, a service provider for config and migrations, and tests. Estimate 1–3 engineering days including test coverage.packages/, strip Symfony/Doctrine imports, rewrite persistence against Eloquent, add a suite before any feature work. Budget 3–10 days and assume permanent fork ownership. Justify only if the spike finds genuinely non-trivial domain logic.Compatibility — assume broken until proven. Confirm composer.json constraints first; check for PHP 8.x hazards (dynamic properties, ${var} interpolation, each(), implicit nullable params) and Doctrine DBAL 3/4 removals. Treat any green result as surprising, not expected.
Sequencing for a TPM to schedule:
composer why-not against the target Laravel version, check tests and constraints. Decision gate: build / port / drop.Maintenance — we own it either way. Upstream is effectively unmaintained: no release cadence, no security disclosure process, no community. Whether code arrives via Composer or a fork, the team owns every future bug, PHP upgrade, and Laravel major bump. For a dependency this small, the maintenance delta between "vendored fork" and "clean reimplementation" is negligible — which favors building. TPM action: assign a named internal owner before the first commit; unowned internal packages rot quickly.
Support — none. No vendor, no maintainer responsiveness, no Stack Overflow corpus, no documented API. Internal docs must be written from source. Acceptable for a ~300-line utility; unacceptable for anything load-bearing without an owner and a test suite.
Scaling — the query pattern is the risk, not the package. Key/value metadata is EAV-shaped. Read-by-key on a single model is fine with a composite index. "Find all entities where metadata X = Y" requires per-key indexes or a JSON/GIN-style index and will not come from a Symfony2-era bundle. TPM action: require an explicit answer on query patterns before approving the schema; budget a promoted-columns escape hatch for hot keys, and size it now rather than after the first slow query.
Failure modes to plan for and name in the design review:
"1", 1, and true round-tripping inconsistently.(model, key) writes if upsert semantics are unspecified.Ramp-up — low ceiling, no documentation. A mid-level engineer can read the source in ~0.5 day, but that time goes to reverse-engineering intent rather than learning an API. A native build has comparable ramp-up with materially better long-term clarity — a relevant factor for team scaling and onboarding.
Recommendation: No-go on the dependency. Use the repository as a design reference inside a timeboxed spike, then build a small in-house Laravel package (1–3 days) unless the spike surfaces non-trivial logic worth porting under MIT. Keep the underlying capability — extensible customer- or integration-defined attributes — on the discovery backlog gated on a concrete requirement, since that is the real roadmap decision this package surfaces.
How can I help you explore Laravel packages today?