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

Storage Bundle Laravel Package

1tomany/storage-bundle

A Symfony bundle for uploading files to remote storage services like Amazon S3, Cloudflare R2, Google Cloud Storage, and Azure Blob Storage, plus a mock client for testing integrations without a network connection.

View on GitHub
Deep Wiki
Context7

Product Decisions This Supports

  • Build vs. buy for file storage plumbing. The package is a thin, MIT-licensed abstraction over "put/get/delete a file in a remote bucket." It is not a platform, so the buy decision is cheap and reversible — but for a Laravel codebase the honest baseline is that Laravel already ships this (Storage facade + Flysystem drivers for S3 and R2, plus Storage::fake() for tests). The package only earns its place if it beats that baseline on a specific axis.
  • Multi-provider portability as a roadmap hedge. Clients are resolved by a onetomany_storage.client config key and a tagged ClientInterface, so switching from S3 to an S3-compatible provider (Cloudflare R2) is configuration, not code. This supports a "don't get locked into one object store" positioning in our architecture docs — useful when procurement or finance wants leverage on egress costs.
  • CDN-fronted delivery as a first-class feature. The custom_url setting rewrites returned object URLs to a CloudFront or public R2 domain (https://files.app-cdn.com/users/10/files/avatar.png). This directly supports product decisions around image/asset delivery performance and CDN cost control without touching application code.
  • Provider-agnostic media features. Avatars, document attachments, user-uploaded media, and generated exports can all go through one UploadActionInterface / DownloadActionInterface / DeleteActionInterface seam, which keeps storage concerns out of domain code and makes a future "bring your own bucket" enterprise ask less expensive.
  • Test strategy and CI cost. The included mock_client removes network dependency from tests. In a Laravel shop this is a feature-parity decision, not a differentiator — we should benchmark it against Storage::fake() before crediting it in a build-vs-buy comparison.
  • Extensibility for a future provider. The tagged-client pattern means a custom backend (Azure Blob, GCS, an internal object store) can be added by implementing one interface — a credible answer to "what if we need X later?" Note that the README claims Google Cloud Storage and Azure Blob support but only documents Amazon and Mock configurations; treat those claims as unverified until a spike proves them.

When to Consider This Package

Consider it when:

  • We are running a Symfony-first or Symfony-heavy service (this is a Symfony bundle; Laravel interop is glue we would own). In a pure Laravel context, this is a hard mark against it.
  • Multiple storage providers must be swap-in-configurable at runtime or per-environment, and we want a single interface enforced across them rather than relying on Flysystem driver config.
  • The team specifically wants a per-operation action seam (UploadActionInterface) rather than a disk/facade model — the README's rationale (clear intent in constructor signatures, pre/post-processing hooks, easier mocking of one method) is legitimate and worth crediting.
  • A product requirement is custom CDN URL rewriting and we'd otherwise hand-roll it on top of Flysystem.
  • We want a small, readable dependency to fork or vendor under MIT if it doesn't fit — the code surface is modest enough for that to be realistic.

Look elsewhere when (this will be most cases):

  • It's a standard Laravel application. Use Storage disks, the S3/R2 drivers, Storage::fake(), and temporaryUrl(). We get more capability, zero glue, and first-party maintenance.
  • We need presigned/direct-to-cloud uploads, multipart or chunked uploads, streaming downloads with range support, signed temporary URLs, or image manipulation. None of these are documented here.
  • We need Laravel Vapor, Forge, or Laravel-native queue integration — not present.
  • We require vendor support, SLAs, or a security review response. The adoption signals are effectively zero: 0 stars, 0 dependents, a single maintainer (1:N Labs), and an opportunity score of ~23. The package is real and recent (v3.1.1, 2026-06-03) but has no evidence of production usage beyond its author.
  • We depend on Symfony 8 alignment. v3.0.1 upgrades to Symfony 8.0; Laravel's pinned Symfony components will almost certainly lag, creating version-conflict risk in composer.json that we would have to manage forever.
  • Compatibility is unverified against our exact stack. The UploadRequest takes a path/format/key, not Laravel's UploadedFile — an adapter is required and is ours to write and test.

Recommendation for the decision log: do not adopt as a dependency of record. Run a timeboxed one-to-two week spike behind a StorageGateway interface we own; if the spike fails to beat the native Storage facade on multi-provider switching or CDN URL handling, close the evaluation and keep Flysystem.

How to Pitch It (Stakeholders)

To executives (one paragraph): This is a small, MIT-licensed library that standardizes uploading, downloading, and deleting files across cloud storage providers, with a built-in mock for testing and a simple setting to serve files from our own CDN domain. The license is free and the integration cost is low, but its adoption signals are essentially zero — no known users, one maintainer — and our Laravel stack already provides comparable capability out of the box. Recommendation: fund a two-week evaluation, not an adoption. The upside is a cheap option to move between storage vendors and control CDN delivery; the downside is glue code we own and a dependency we may have to fork. Treat it as a low-cost hedge, not a strategic platform bet, and do not let it become a single point of failure on the media path.

To engineering (the honest version): The design is sound — ClientInterface with tagged, config-keyed clients; three action interfaces (Upload/Download/Delete) that give us one-method seams and clean test doubles; a mock_client for offline tests; and custom_url for CDN rewriting. Two caveats you should price in: it's a Symfony bundle, so Laravel means a service provider, config bridging, and an adapter between Symfony's request objects and Illuminate\Http\UploadedFile; and it has no facade, no temporaryUrl(), no presigned or chunked uploads, and the GCS/Azure claims in the README are undocumented. The Symfony 8 dependency in v3.0.1 is a real conflict risk against our pinned components. What we'd build either way: a StorageGateway abstraction we own, with this package as one swappable implementation behind it — so the eval is decoupled from the adoption decision, and backing out costs one class.

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.
thomas-0816/doctrine-dbal-duckdb
moyisoft/laravel-admin
oxygen/mod-pages
oxygen/mod-import-export
oxygen/mod-media
ksoft/laravel-contentbuilderjs
ourgoldpackages/exchange
mikkimike/laravel-exchange1c
wandesnet/mercadopago-laravel
tsfcorp/email
larafony/core
laravel-enso/currencies
tartan/laravel-online-payment
wedevbr/celcoin-laravel
surazdott/nepali-date
devsquad-cockpit/laravel
coding-socks/laravel-upload-handler
artisanbarista/laravel-shield
instance-code/repository
flooris/prestashop-models