jeroenvdheuve/assetic-cache-busting-worker-bundle
Symfony bundle that adds an Assetic worker appending cache-busting query strings to asset URLs, so updated CSS, JS, and images are served fresh without stale browser caches. Integrates with Assetic's worker pipeline for automatic asset versioning.
Architecture fit — poor, and mismatched at the ecosystem level. Unchanged by v1.0.3. Despite the framing as a "Laravel/PHP package," this is a Symfony bundle. It contributes a DependencyInjection extension and a compiler pass that registers Assetic\Factory\Worker\CacheBustingWorker into AsseticBundle's assetic.factory worker chain, so that dumped asset filenames get a content hash appended (file-<hash>.css). Laravel has no bundle registration mechanism, no Assetic factory, and no asset-dump step that this could hook into — Laravel's container service providers are a different contract entirely. Laravel does consume Symfony components, but only at pinned versions beneath the framework; a third-party bundle cannot attach to that layer.
The v1.0.3 release adds an Assetic cached-worker suggestion — guidance for reusing a compiled asset when the same source is pulled in by multiple Twig templates. It is a documentation/configuration-level addition, not a new integration surface: it does not introduce a Laravel service provider, a facade, a manifest reader, or any Composer constraint relief. The only consumer it can possibly help is an Assetic-based Symfony application, which is precisely the target we have already ruled out for a Laravel stack.
Integration feasibility — effectively zero for Laravel. Unchanged. Adoption would require symfony/framework-bundle, symfony/assetic-bundle, and assetic/factory to be resolvable alongside Laravel's own pinned symfony/* constraints. A 2016-era bundle will declare constraints against Symfony 2.8/3.x and PHP 5.5–7.0, which collide with any modern Laravel install (Symfony 6/7, PHP 8.2+). Even in the unlikely event Composer resolves it, there is no runtime seam to register the worker — the feature would be inert.
Technical risk — still high, with one factual correction to make. The v1.0.3 release contradicts the earlier premise that the package has seen no upstream activity since 2016-03-09. That is worth verifying before repeating "archived and dormant" in any decision record: confirm current archive status and release date on the repository, because a fresh tag either means the project was unarchived (which changes the maintenance narrative but not the fit) or that the tag was published against a still-archived repo (which means no support commitment exists behind it). Either way, one doc-level release after roughly a decade is not a maintenance posture. The transitive risk remains the larger exposure: Assetic is a legacy asset pipeline that Symfony itself moved away from (Webpack Encore, then AssetMapper/Vite), so the underlying dependency is equally unmaintained. Supply-chain exposure is small (a service definition, a compiler pass, and now a config suggestion; MIT), but the "abandoned dependency blocks a PHP upgrade" scenario is still the realistic cost.
Key questions before proceeding:
composer why assetic/factory)?v=<hash> query string acceptable? The two behave differently at the CDN layer.Verdict: unchanged — reject for any Laravel target. v1.0.3 is a performance-tuning suggestion for a pipeline we should not be running. The correct response to the underlying requirement is a native mechanism, not this package.
Stack fit. For Laravel, cache busting is a solved, first-party problem:
public/build/manifest.json. The @vite Blade directive and Vite::asset() resolve through the manifest. No additional package needed.mix.version() produces mix-manifest.json; the mix() helper resolves hashed paths.md5_file() against a cached manifest, or filemtime() as a cheap ?v= token.v1.0.3 does not create a new option here. Its cached-worker suggestion addresses duplicate compilation of the same source within an Assetic dump — a build-time inefficiency that Vite and Mix already avoid by design (single entry graph, one build per entry, manifest emitted once).
Migration path. There is nothing to migrate to this package. The migration is away from Assetic-style workers toward manifest-driven asset resolution:
Compatibility. If a legacy Symfony application genuinely still runs on Assetic, this bundle is only viable inside the narrow band of Symfony 2.8/3.x-era constraints. Validate with composer why-not jeroenvdheuve/assetic-cache-busting-worker-bundle and a --dry-run update before touching the lockfile. Given the bundle is tiny and carries no support commitment, vendor/fork the two or three files rather than depend on the Packagist entry — it removes the abandoned-package flag from audit tooling and lets you patch PHP-version compatibility yourself. If you do fork, fork at v1.0.3 so the cached-worker guidance is captured; note that the suggestion is configuration, so it costs you nothing to adopt or ignore later.
Sequencing. (1) Decide pipeline target — Vite or Mix — before any asset work. (2) Prototype native hashing on one asset class and verify the manifest is committed to the deploy artifact. (3) Parity-test against the old behaviour across browser cache, CDN, and opcache layers. (4) Only if step 1 lands on "legacy Symfony + Assetic," fork and vendor this bundle as a tactical stopgap, with an explicit ticket to remove Assetic entirely — and only then evaluate whether duplicate compilation is actually costing you build minutes.
Maintenance. Revised, narrowly: the package is no longer accurately described as having zero upstream activity, but a single documentation-level tag does not constitute maintenance. You still inherit any fork outright, and there is no evidence of issue triage, dependency bumps, or PHP 8.x compatibility work. The mitigating factor remains size: a DI extension, a compiler pass, and a service definition. A competent Symfony developer can reproduce the behaviour in a day, which caps the fork cost but also raises the question of why you would fork at all.
Support. No community, no triage process, no security advisories, no maintainer response path that we can evidence. A release published without a support commitment is not the same as a supported release. Dependency-upgrade failures will surface in Composer as hard blocks rather than graceful deprecations, meaning a routine PHP or Symfony bump becomes an unplanned project. This remains the dominant operational cost.
Scaling. No runtime scaling concern — the worker executes at asset-dump time, not per request. v1.0.3 is explicitly a build-throughput change: it targets the case where one asset is compiled repeatedly because it appears in multiple Twig templates. Treat that as a CI-minutes optimisation with a narrow blast radius, not an architectural improvement, and measure before adopting — the same duplicated-include pattern that motivates it is usually a template-hygiene problem. The scaling-relevant architectural detail is unchanged: hash-in-filename (what this worker does) is CDN-friendly because it permits immutable, long-max-age edge caching, whereas query-string busting forces cache revalidation. That is the one genuinely correct instinct in the package, and it is already the default in Vite and available via mix.version().
Failure modes. Watch for:
public/build.Ramp-up. Near-zero for the native path — any Laravel developer already knows mix()/@vite. For Assetic, effectively negative: new hires will not know it, the documentation is a decade old plus one release note, and knowledge concentrates in whichever engineer originally set it up. That is a single-point-of-failure on the build pipeline.
Bottom line for a TPM: v1.0.3 changes nothing about the fit — it is a build-time suggestion for a Symfony/Assetic pipeline, published against a package with one star-tier following and no support commitment. Confirm the current archive status so the decision record is accurate, but do not introduce this package. Fund a half-day spike on the native Vite/Mix manifest path instead; if a legacy Symfony app is the real context, treat a vendored fork at v1.0.3 as a dated tactical patch with a scheduled exit from Assetic.
How can I help you explore Laravel packages today?