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

Upload Bundle Laravel Package

ruwork/upload-bundle

Ruwork Upload Bundle is a Symfony bundle that provides reusable file-upload handling for PHP applications. It helps reduce boilerplate around receiving, storing, and managing uploaded files, making upload logic easier to organize and integrate into your project.

View on GitHub
Deep Wiki
Context7

Technical Evaluation

Architecture fit. The first finding is unchanged and remains the one that governs everything below: ruwork/upload-bundle is a Symfony bundle, not a Laravel package. It ships a Bundle subclass with a DI extension and configuration tree, and integrates through Symfony's container, event dispatcher, and Doctrine bridge — none of which exist in a Laravel application. There is no service provider, no config/upload.php, no facade. Its likely shape (an uploaded-file wrapper plus Doctrine entity/lifecycle hooks for persisting and removing files on disk) is close in spirit to VichUploaderBundle, but the integration seam is entirely Symfony-native. On a Laravel stack the fit is effectively zero without a bespoke bridge; on a Symfony stack the fit is conceptually reasonable but the codebase is many major versions behind.

Integration feasibility. Low-to-moderate, and entirely dependent on which framework is actually in play. Version 0.5.2 is a single-line patch that does not touch dependency constraints, so assume the same 2018-era php: ^7.1 / symfony/*: ^3.4|^4.0 pins remain. Installed against a modern Symfony (6.4/7.x) or PHP 8.2+, expect immediate friction: Composer will resolve those constraints away rather than into your stack. Even after relaxation, deprecated container conventions, non-autowired service definitions, and PHP 8 issues (implicit nullable parameters, dynamic properties, ReturnTypeWillChange on Doctrine/ArrayAccess implementations) remain the probable fault lines. On Laravel, integration is still a rewrite, not an integration. Note also that 0.5.2 is the highest version number this package has ever carried — it has never reached 1.0, so no API stability contract has ever been offered.

Technical risk. High, concentrated in four areas, with one of them now requiring a correction. (1) Abandonment — the previous assessment's "last release 2018-07-30" is no longer accurate: 0.5.2 exists. But a single drive-by patch after roughly seven years, unaccompanied by issue triage, documentation, dependency bumps, or a published maintenance policy, is not evidence of revived stewardship. Treat it as one data point, not a trend, and downgrade the abandonment risk from "certain" to "high but no longer absolute." The package still has effectively zero stars and zero dependents, so there is still no upstream constituency to patch a security or compat issue promptly. (2) Supply chain — Packagist has historically flagged the package abandoned; confirm whether that flag has been lifted, because if it persists the artifact and the advisory metadata disagree, and that disagreement is itself an audit finding. (3) Invisible scope — file upload code touches filesystem permissions, path traversal, MIME validation, and orphan cleanup, and the new release is directly in that territory: "create dir before saving from tmp path" means the package now performs a filesystem side effect it previously assumed away. (4) Bus factor — the only durable maintainer would be us. The MIT license remains the one unambiguous positive: vendoring or forking is legally clean.

Key questions.

  • Is the target stack Laravel or Symfony? (The request says "Laravel/PHP package"; the artifact says Symfony bundle. These cannot both be true and the answer changes the estimate by an order of magnitude.)
  • What capability is actually required — simple UploadedFile persistence, storage abstraction, image processing, or chunked/JS uploads? A narrower need likely has a maintained first-party answer.
  • Who cut 0.5.2, and is there any stated commitment behind it (a successor maintainer, a fork upstreamed, a company with a stake), or is it an unattributed one-off?
  • What are the directory-creation semantics in the patch — what mode is the directory created with, is the path derived from user-controllable input, and how are concurrent uploads to the same new directory handled?
  • Which Symfony, PHP, and Doctrine versions are in production today, and what is the upgrade horizon?
  • Does anything in the dependency graph carry the same abandonment profile?

Integration Approach

Stack fit. Three scenarios, with different verdicts. Laravel: not viable — treat the package as design inspiration only and implement natively (UploadedFile::store(), a files table, a storage disk via Flysystem). Symfony 3.4/4.4 (legacy, matching the package era): the only scenario where direct adoption is technically plausible, but you are then adopting a stale dependency into an already-legacy app, which compounds the eventual upgrade. Symfony 5.4+/6.4/7.x: compatibility work is likely larger than the package's useful surface area; replace rather than port.

Migration path. Unchanged by this release — 0.5.2 adds no storage abstraction, so it does not move the package any closer to being the right long-term seam. Whatever the origin, converge on league/flysystem-bundle as the storage abstraction and Symfony's native UploadedFile handling at the controller boundary. This decouples "where bytes live" (local, S3, GCS) from "how the entity references them," and it is the layer the old bundle was approximating. For the ORM side, either an explicit service that owns persist/remove (preferred — testable, no magic lifecycle callbacks) or VichUploaderBundle if you want a maintained, batteries-included equivalent with an active release cadence. If the package's specific API is load-bearing in existing code, wrap it behind an internal interface in one commit, then swap the implementation behind that interface later.

Compatibility. Pin and prove, don't assume. Diff composer.json between the previously evaluated version and 0.5.2 before anything else — a patch release that changes only source and leaves php: ^7.1 / symfony: ^3.4|^4.0 intact is still uninstallable on a modern stack, and the version bump tells you nothing about that. Run composer why-not against the target framework, then a throwaway-branch install with relaxed constraints to enumerate actual failures rather than predicted ones. Check transitive dependencies for their own abandonment flags and whether the Packagist abandoned marker was cleared. Verify the Doctrine version — the ORM's mapping and lifecycle APIs changed materially across 2.x → 3.x.

Sequencing.

  1. Day 0, hour 1: diff. Compare 0.5.2 against the prior tag — source, composer.json, CI config, changelog. A single-commit patch is five minutes to read and tells you whether anything structural moved. It did not.
  2. Day 0–1: spike. Confirm framework, read constraints, attempt install on a scratch branch, catalogue breakage. Deliverable: adopt / fork / replace recommendation with a number attached.
  3. Day 1–2: decision record. If replacing, name the successor (Flysystem + native handling, or VichUploader) and the interface boundary. If forking, scope the fork to the observed API surface only — typically a few hundred lines — and record the SHA, which now means 0.5.2 rather than the 2018 tag.
  4. Week 1: boundary first. Introduce the internal upload service/interface and route all call sites through it, with no behavior change. Tests at this seam are the whole payoff.
  5. Week 2: swap. Implement behind the interface; delete the bundle; verify orphan-cleanup and deletion paths explicitly, since these are the least-tested and most consequential behaviors.
  6. Ongoing: guardrail. Add a CI check that fails on abandoned Composer packages so the next one is caught at PR time rather than at audit time.

Operational Impact

Maintenance. This remains the decisive cost, but the release forces a more precise statement. One patch after seven years is not a maintenance cadence; it is evidence that someone, somewhere, hit a cold-start bug and fixed it, which is not the same as an owner. The burden still transfers to us in full, and it transfers at the worst possible moment — during a framework upgrade when the package is the one thing blocking it. Budget realistically: a fork of this scope is small enough to own (order of days, not weeks) but it must be owned, with a named maintainer and a stated review cadence, or it becomes silent debt. If 0.5.2 turns out to be the first act of a genuine revival, revisit; until then, plan as if it is the last commit.

Support. No upstream issues triage, no security advisories, no release notes beyond a one-line bullet, no maintainer to escalate to. A single commit does not create a support channel. Internal engineers remain the sole source of answers, which raises onboarding cost for anyone touching upload paths. This is tolerable for a contained utility and intolerable for anything on a compliance or data-handling boundary. Check whether the organization's policy treats abandoned dependencies as a finding — many do, and that alone can end the discussion.

Scaling. Upload paths are I/O-bound and the package is unlikely to be the bottleneck; the real scaling questions are storage backend, orphan-file growth, and whether processing is synchronous in the request cycle. A 2018-era upload helper almost certainly assumes local disk and synchronous handling, so any move to S3 or to async processing (Symfony Messenger / queued jobs) means replacing the storage layer anyway — at which point the case for keeping the package collapses. If file volume is material, insist on async processing and lifecycle rules from day one rather than retrofitting. The new implicit directory creation is also a scaling-adjacent concern: directory creation on a shared or network filesystem is a contention point, and under concurrent uploads to the same new path it is a race the patch does not visibly address.

Failure modes. Rank-ordered by expected damage: silent orphan accumulation (files written, entity rolled back, no cleanup job) inflating storage cost and, worse, leaking deleted content; path-traversal or unrestricted-extension write if validation is delegated to a stale helper; implicit directory creation with default umask or inherited parent permissions, producing permissive directories or a hard failure against read-only or mounted filesystems — small, but this is the code path the release just touched and therefore the least exercised; hard failures on PHP/framework upgrade that block the whole upgrade, not just uploads; and a compromised or typosquatted transitive dependency that no advisory feed is watching. The existence of this bug until now is itself a signal: deployment cold-start and first-run paths were untested for seven years, so expect more of that class. Each failure is cheap to mitigate if the code sits behind an internal interface and is covered by tests — expensive if it is called directly from a dozen controllers.

Ramp-up. Low for the concept, moderate for the archaeology. Any engineer can implement upload handling; the cost is in reverse-engineering undocumented 2018 idioms without upstream documentation and without a community to search. Estimate roughly half a day for a competent Symfony engineer to read the source and characterize it, plus a day to a week to reach production confidence depending on whether the outcome is fork or replace. On a Laravel team, add the cost of explaining why the Symfony bundle is not an option — and expect that conversation to consume more time than the replacement implementation itself.

Recommendation. Do not adopt; 0.5.2 does not change this. On a Symfony 3.4/4.4 legacy application, adopt only as a time-boxed stopgap with a documented replacement ticket, and only after confirming the directory-creation behavior is safe in your deployment environment. On anything modern — and certainly on Laravel — replace with maintained components behind an internal interface. The package's value is as a reference implementation, not a dependency; MIT licensing makes borrowing the parts you need straightforward and legally clean. Re-evaluate only if a second and third release follow within a normal cadence and the dependency constraints move.

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.
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
jinas/dhivatar
store-doc/laravel-storage-driver
plus-it/laravel-translation-manager
diephp/perhaps
diephp/telegraph
osmaviation/spreadsheet
microsoft/fluentui-system-icons
mmccook/php-json-canonicalization-scheme
middlewares/firewall
qubiqx/montapacking
nyoncode/laravel-package-console