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

Simple Metadata Bundle Laravel Package

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.

View on GitHub
Deep Wiki
Context7

Technical Evaluation

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):

  • Is the underlying requirement real? Do we have a named customer or integration partner asking for user-defined attributes, or is this speculative roadmap?
  • Which access patterns matter: read-by-key only, or "find all X where metadata Y = Z"? The latter dictates schema and indexing and is not solved by the bundle.
  • Does the source contain non-trivial logic (typed value coercion, metadata schema validation, inheritance) worth porting under MIT, or is it a thin CRUD wrapper?
  • Do tests exist and do they run on PHP 8.x?
  • Is a maintained alternative (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.

Integration Approach

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).

  1. Build natively — recommended. Scope is small and well-bounded: a 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.
  2. Vendor and port — exception only. Fork the MIT source into 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:

  1. Gate 0 — requirement validation (before any engineering time). Confirm a concrete near-term need. No requirement, no project; keep metadata on the discovery backlog.
  2. Spike (≤4 hours, one engineer). Read source, composer why-not against the target Laravel version, check tests and constraints. Decision gate: build / port / drop.
  3. Access-pattern spec (≤0.5 day). Enumerate what the product actually needs: read-by-key, query-by-metadata, bulk attach, type fidelity, deletion semantics, tenant scoping.
  4. Build (1–3 days). Ship behind a repository/registry interface so a future swap is a container binding, not a refactor.
  5. Migration/backfill plan if legacy attribute data exists.
  6. Governance layer if multi-tenancy, audit, or key validation is required — this is custom work regardless of which route is chosen, and should be sized explicitly rather than assumed.

Operational Impact

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:

  • Composer resolution failure, or a silent install with unmet platform requirements.
  • Fatal errors on PHP 8.x from legacy syntax or removed Doctrine DBAL APIs.
  • Type coercion loss — "1", 1, and true round-tripping inconsistently.
  • Orphaned rows when parent models are deleted without cascading cleanup.
  • Silent overwrite on duplicate (model, key) writes if upsert semantics are unspecified.
  • N+1 queries when metadata is loaded per model without eager loading.

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.

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.
uni-method/symfony-lib
tacticmedia/scim-server-bundle
neika-ai/symfony-bundle
mattleads/agent-publishing-bundle
glavweb/framework-bundle
glavweb/extra-bundle
glavweb/api-bundle
glavweb/admin-bundle
adachsoft/api-version-bundle
elsayed85/laravel-api-exceptions
ouhssini/laravel-demo-mode
daworks/ncloud-outbound-mailer-driver
gp247/cms
ignibyte/aic-gates
nexa-merchant/blog
novasa/laravel-language-center
opencage/geocode
adolfoholzer/parameters
livenetworks/ln-starter
cgv/localized-resource