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

Purgatory Bundle Laravel Package

sofascore/purgatory-bundle

A Symfony bundle from Sofascore for purging Doctrine entities after a configurable retention period. Define purge rules, schedule cleanup, and automatically remove stale or expired records with minimal configuration and Symfony-native integration.

View on GitHub
Deep Wiki
Context7

Technical Evaluation

Architecture fit — unchanged: poor as a drop-in, moderate as a pattern source. v2.0.2 changes nothing about the framework mismatch. In fact it reinforces it: the changelog names VarnishPurger, AsyncPurger, and TraceablePurger, and the fix list references TransportExceptionInterface (Symfony's HTTP client exception contract) and iterator_to_array key preservation in a traceable/debug purger. That is a Symfony-idiomatic component set — HTTP client contracts, an async dispatch layer (very likely Symfony Messenger), and a profiler-integrated decorator. None of that is honored by Laravel's container, queue, or package auto-discovery. The usable asset remains the domain logic: tag registry plus backend adapters translating tags into Varnish PURGE/BAN. Assume a port.

Second-order caching-topology concern is unchanged. Value remains proportional to running Varnish with tag/ban support; Fastly, Cloudflare, or Akamai edges inherit only the tag-management ideas. Confirm before investing.

Integration feasibility — unchanged in cost, slightly improved in clarity. The release is useful primarily as specification detail. It confirms the package has, at minimum: a synchronous Varnish transport purger, an async purger that batches/iterates tags into messages, and a traceable decorator for observability. Those map cleanly onto a Laravel port — Illuminate\Support\Facades\Http for transport, a queued job for async, and a logging/null decorator for the shadow-mode stage we already planned. The bounded 2–4 week build estimate holds. Consuming it as a dependency remains non-viable.

Technical risk — marginally improved on maintenance, still elevated overall. Positive signal: an active patch release with three fixes from a named external contributor, not just the sponsoring vendor. That is a healthier cadence signal than the prior assessment could assume, and it confirms the 2026-10-09 metadata is accurate rather than stale. Countervailing signal: all three fixes are on failure and edge paths — an uncaught transport exception, an empty-message dispatch for empty iterables, and key preservation in a debug decorator. Those are exactly the paths a cache invalidator lives or dies on, and their presence in a 2.0.x patch suggests the failure path is comparatively under-tested relative to the happy path. 119 stars, single-sponsor stewardship, and no SLA are unchanged. MIT license still makes forking unencumbered, and we would own the fork.

Key questions (revised; resolved items noted)

  1. Is our HTTP cache Varnish with tag/ban support, or a CDN? Which backend adapters are actually relevant? (open — blocking)
  2. Does the package expose backend adapters behind an interface we can reimplement, or are they entangled with Symfony HTTP client and config? (partially answered — VarnishPurger clearly sits on Symfony's HTTP client contract; adapter seam exists but is Symfony-shaped)
  3. What Symfony and PHP version ranges are supported, and what is the real release/commit cadence over the last 12 months? (partially answered — cadence is active; version ranges still to verify)
  4. Does it support batching, async/queued purging, retries, and per-backend failure isolation? (partially answered — AsyncPurger exists and now guards against dispatching empty messages; retry/backoff and per-backend isolation still unverified. Check whether AsyncPurger is built on Symfony Messenger, which would deepen entanglement.)
  5. How are tags generated and bounded — documented taxonomy, or arbitrary app-defined strings? (open)
  6. What is the blast radius of a failed purge? (partially answered — transport exceptions are now caught rather than propagating. Critical follow-up: caught-and-logged-and-retried, or caught-and-swallowed? The latter converts a crash into silent staleness, which is worse.)
  7. Are there tests we can run against a mocked backend to validate behavior before committing? (open — and the nature of these three fixes argues for reading the test suite rather than trusting it)
  8. Is there a framework-agnostic core package underneath that we could consume directly? (open)
  9. New: does TraceablePurger emit enough structured detail (tags, backend, outcome, latency) to serve as the template for our shadow-mode decorator?

Integration Approach

Stack fit. Unchanged. Highest fit if the application were Symfony + Varnish — it is not. Adoption-as-dependency: near-zero. Adoption-as-reference: good, and this release improves the reference by documenting real failure-path behavior.

Migration path — four options, in preference order (unchanged).

  1. Pattern port (recommended). First-party Laravel package: CacheInvalidator service, tag registry driven by Eloquent and domain events, backend contract with a Varnish adapter, queued PurgeTags job, config for endpoints and credentials. Use v2.0.2 source as the specification, and port the fixed semantics, not the pre-fix behavior.
  2. Extract-and-adapt. Only if the backend adapters are cleanly decoupled from Symfony's container, config tree, and HTTP client. The TransportExceptionInterface fix indicates at least one adapter is bound to Symfony's HTTP client contract, which weakens this option. Re-evaluate only after reading the source.
  3. Sidecar. Rejected unless we already operate Symfony services.
  4. Direct adoption. Not applicable.

Compatibility. Unchanged: check PHP constraint against runtime, Symfony component versions against illuminate/*, and PSR-18/PSR-7 usage. If vendoring any code, pin to a commit SHA — specifically the v2.0.2 tag or later, since 2.0.1 carries a known uncaught transport exception and an empty-message dispatch bug we do not want to replicate.

Sequencing. Unchanged, with one insertion.

  • Week 1–2: Spike. Read source, document tag model and backend contract, stand up local Varnish to confirm purge mechanics. Decision gate at end of week 2.
  • Week 3–4: Build Laravel adapter and tag-emission middleware; unit-test against a fake backend. Model the shadow-mode decorator on TraceablePurger.
  • Week 5: Shadow mode — compute would-be purges and log without sending; compare against observed cache behavior.
  • Week 6: Canary on one low-risk, highly cacheable domain with a rollback switch.
  • Week 7+: Broaden by domain; formalize tag taxonomy and ownership.

Operational Impact

Maintenance. Unchanged in magnitude, slightly improved in confidence. A 119-star, single-sponsor package still is not something to track passively — budget ~0.1–0.2 FTE for a first-party fork or port plus review of upstream changes worth cherry-picking. Pin versions and mirror the source internally. Treat this patch release as one data point of health, not a trend.

Support. Community-only, no SLA, upstream priorities are Sofascore's. Escalation is a GitHub issue. Acceptable for a ported pattern we own; unacceptable for a production dependency on the critical path of cache correctness.

Scaling. Unchanged: purge volume and tag granularity (batch and coalesce per request cycle), Varnish ban-list growth (expire bans, prefer xkey over regex bans), and queue depth during deploys or bulk imports. The AsyncPurger empty-iterable fix is a small reminder that batching layers generate their own noise — guard our implementation against dispatching empty or duplicate purge batches, which inflate queue depth and backend load without invalidating anything.

Failure modes.

  • Silent purge failure → stale content served indefinitely. Now that transport exceptions are caught rather than thrown, verify the package's post-catch behavior; if it swallows, it has traded a visible crash for invisible staleness. Our port must alert on non-2xx and on transport exceptions, and monitor purge-to-write ratio anomalies.
  • Over-purging or an over-broad tag → origin thundering herd; rate-limit and require tag allow-listing.
  • Tag drift — application code emits tags the invalidator does not know about, orphaning cache entries; enforce via a central enum plus a test asserting every cacheable response carries a known tag.
  • Auth/ACL misconfiguration on the purge endpoint, or exposing it publicly.
  • Partial failure across backends leaving edge nodes inconsistent; treat each backend as independently retryable and observable.
  • Empty or malformed purge payloads (the class of bug fixed in 2.0.2) — assert non-empty, well-formed batches before dispatch.

Ramp-up. Unchanged: two to three weeks for a mid-level engineer, dominated by HTTP caching mental models (surrogate keys, ban vs. purge semantics, TTL interaction) rather than the package. Enablement required: written tag taxonomy with owners, a "content is stale" runbook, and local Varnish in the dev environment.

Recommendation. Unchanged at ~20.9 with an opportunity score of 1.78. v2.0.2 is a maintenance patch — no breaking changes, no new features, no deprecations — so it does not alter the adoption calculus. It does modestly improve the maintenance signal, partially answer open questions about async purging and transport error handling, and sharpen the port specification. Use it as a design reference, port the tag-and-backend model into a small first-party Laravel package, and revisit only if the platform standardizes on Symfony or the package gains a framework-agnostic core.

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.
novasa/laravel-language-center
opencage/geocode
adolfoholzer/parameters
livenetworks/ln-starter
shitoudev/permissionmanager
johannesclimacus/laravel-tui
hocvt/seotools
vitalybaev/sypexgeo
amphibee/themosis-ignition
gito-me/fast-excel
frankyso/laravel-ipaymu
geolize-studio/laravel-chile
boomerangui/chat
cgv/localized-resource
noith/settings
kda/laravel-package
kda/filament-dynamic-navigation
bypersoft/signbox
pairus/product-data
fayne/laravel-filament-cms-core