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

Tag Bundle Laravel Package

fpn/tag-bundle

FPN Tag Bundle brings flexible tagging to Symfony applications. Add tags to Doctrine entities, retrieve objects by tag, and render tag clouds through a simple, configurable API. It provides ready-to-use services and integration for building searchable, categorized content.

View on GitHub
Deep Wiki
Context7

Technical Evaluation

Architecture fit fpn/tag-bundle is a Symfony bundle, not a Laravel package. Its unit of distribution is a Bundle subclass with a DI Extension and service YAML; its runtime value is delivered through Doctrine ORM mappings (a Tag entity, a Tagging join entity, a Taggable interface plus trait, a TagManager, and a TaggableListener event subscriber). Laravel has no bundle lifecycle, no compiler passes, and no auto-registered Doctrine mapping driver. The conceptual model — attach free-form labels to arbitrary entities through a polymorphic join table (taggable_type/taggable_id) — ports cleanly to Eloquent. The implementation does not. From a TPM standpoint: conceptually relevant, mechanically incompatible. Evaluate it as a specification artifact, not a candidate dependency.

Integration feasibility Adopting it in a Laravel app requires a source-extraction and rewrite effort, not an install:

  1. Commit to Doctrine ORM inside Laravel (laravel-doctrine/orm or equivalent) — an architectural decision most Laravel codebases have explicitly avoided.
  2. Replace the bundle's DI wiring with a service provider and container bindings.
  3. Replace Symfony event-subscriber and form-type integration with Laravel equivalents (model events, validation, Blade/Livewire UI).
  4. Confirm the persistence layer matches whatever Doctrine ORM version the app runs, and that the mapping style (annotations vs. attributes) is even parseable.

Steps 2–4 are the whole job. At that point the package is a reference implementation and the deliverable is bespoke code we own — which reframes the decision from "adopt vs. build" to "read vs. ignore."

Technical risk

  • High — dependency resolution. Built against Symfony 2.x-era constraints (PHP 5.3+). Modern Laravel pins symfony/* to 6/7. Composer will almost certainly refuse to resolve; forcing it via --ignore-platform-reqs or aliasing yields an untestable runtime. This is a loud risk — cheap to discover in a spike, expensive if discovered late.
  • High — abandonment. 75 stars, 0 dependents, no active maintainer. No security patching, no PHP 8.x guarantees, no regression net for our fixes. Strong dormancy signal; this belongs in the vendor-risk register regardless of outcome.
  • Medium — Doctrine ORM 3 drift. ORM 3 removed substantial legacy API surface; annotation-based mapping from this era breaks outright.
  • Medium — data integrity. Polymorphic join tables typically carry no foreign key to the tagged resource, so orphaned taggings accumulate silently and require application-level cleanup we'd own forever.

Key questions (these gate the whole evaluation; resolve before any commitment)

  • Is the target application genuinely Doctrine-based, or is "Laravel" shorthand for a mostly-Eloquent codebase? This single answer decides the recommendation.
  • What do the declared php, symfony/*, and doctrine/* constraints actually say, and does the code parse under PHP 8.2+?
  • Does the repo ship tests or fixtures usable as a behavioral spec for a port?
  • Is the requirement free-form labels, or does it need taxonomy, hierarchy, synonyms, or faceting? The latter changes the design regardless of source and is a separate roadmap item.
  • Who owns the fork if we adopt, and is that person's time budgeted indefinitely?

Integration Approach

Stack fit Poor for a standard Laravel/Eloquent stack — it will not install or function. Acceptable only as a design reference for a Doctrine-backed Laravel service, or for a legacy Symfony application being maintained rather than migrated.

Migration path (ranked, with TPM recommendation)

  1. Adopt a native alternative — spatie/laravel-tags or a hand-rolled morphToMany. Days of effort, maintained, Eloquent-native, covers the polymorphic join and tag queries. Recommended default.
  2. Port the concepts — lift the Tag/Tagging schema and TagManager semantics (loadTagging/saveTagging, name-vs-entity distinction) into Eloquent models, a trait, and a small service. One to two sprints including data migration. Gives ownership and a clean upgrade path.
  3. Stand up Doctrine in Laravel and adapt the bundle. Highest cost, highest risk, no offsetting benefit. Do not pursue unless Doctrine is already mandated for unrelated reasons.
  4. Keep the Symfony app and consume tagging over HTTP. Only if the tagging domain already lives there.

Compatibility Verify before any commitment: declared php constraint, symfony/* and doctrine/* ranges, annotation-vs-attribute mapping, and whether the Taggable trait uses syntax valid on our minimum PHP. Treat any failure here as a stop sign, not a workaround prompt — this is a TPM enforcement point, because engineers under delivery pressure will reach for --ignore-platform-reqs.

Sequencing

  1. Spike (1–2 days, timeboxed): read Model/TaggableInterface → Entity/Taggable → Doctrine/TaggableListener → TagManager → TagRepository. Confirm the data model satisfies the requirement.
  2. Dependency audit: attempt Composer resolution in a throwaway Laravel skeleton to get a definitive, documented answer.
  3. Decide build-vs-adopt at the end of the spike, not before — record the decision and the rejected options in an ADR.
  4. Schema design: join table, unique constraint on (tag_name, resource_type, resource_id), index strategy, normalization rules.
  5. Implementation: service + trait + query scopes, with tests written against the ported behavior.
  6. UI and data migration last, since they're reversible and the schema isn't.

Operational Impact

Maintenance Effectively zero upstream. Once adopted, the code is ours — every PHP minor, Laravel major, and Doctrine upgrade becomes our regression to catch. Budget a standing maintenance line item, or take option 1 and avoid the liability entirely. This is the cost that rarely appears in the initial estimate and always appears later.

Support No vendor, no active maintainer, no issue triage, no community safety net. Internal knowledge will concentrate in whoever performs the port — a single-point-of-failure risk worth naming explicitly in design review and in the on-call/ownership map.

Scaling Tagging is read-heavy and join-heavy. Watch for:

  • N+1 hydration when loading tags per entity in list views — mitigate with eager loading.
  • Unindexed tag_name lookups for tag clouds and filtering — index tag_name and the composite resource key.
  • Full-table COUNT/GROUP BY for tag counts — cache or denormalize a counts table past ~10⁵ taggings.
  • Unbounded vocabulary producing duplicate near-matches ("PHP", "php ", "Php") — normalize on write, not on read.

Failure modes

  • Composer deadlock at install — loud, cheap, discovered in minutes.
  • Container boot failure from stale DI configuration — cheap if caught in the spike, expensive if caught after sprint commitment.
  • Silent integrity drift: orphaned taggings after entity deletion; duplicate tags from case/whitespace variance. These surface as bad analytics and confusing UI weeks later and are the highest-cost failure mode, because remediation is data repair, not a code change.
  • Upgrade cliff: a future PHP or Doctrine bump invalidates the fork with no upstream fix available.

Ramp-up Low for the domain — tagging is well understood and the API surface is small. Moderate-to-high for the integration: engineers must context-switch into Symfony bundle conventions and Doctrine mapping just to read the source. For a Laravel team that archaeology is the dominant cost and it buys nothing reusable.

Recommendation: treat fpn/tag-bundle as a specification, not a dependency. Approve a two-day timeboxed spike to extract the schema and TagManager semantics, then implement natively or adopt a maintained Eloquent package. Do not attempt to install a dormant Symfony 2.x bundle into a modern Laravel application. Log the zero-dependents finding in the vendor-risk register and close the evaluation.

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.
abbasudo/artisan-route
mirvan/ippanel
ignibyte/aic-framework
glavweb/data-schema-bundle
glavweb/datagrid-bundle
tacticmedia/scim-server
uni-method/frame
neika-ai/sdk
adachsoft/php-code-style
pharaonic/laravel-notification-dependencies
beautinow/translug
dev-brainiac/bot-cloaked
octoberrain/html
octoberrain/extension
octoberrain/exception
octoberrain/contracts
adachsoft/api-version-bundle
cgv/localized-resource
noith/settings
kda/laravel-package