zgldh/qiniu-laravel-storage
Qiniu cloud storage driver for Laravel. Integrates Qiniu object storage with Laravel's filesystem, letting you upload, store and serve files through the familiar Storage facade. Supports custom domains, upload tokens and easy configuration via a dedicated filesystem disk.
Architecture fit
zgldh/qiniu-laravel-storage is a thin driver that plugs Qiniu (七牛云) object storage into Laravel's Storage facade. Architecturally it is the right shape: it registers a custom disk (Storage::extend/service provider), delegates the low-level calls to qiniu/php-sdk, and presents the standard Flysystem surface (put, get, delete, exists, url, listContents). For a TPM this matters because adoption is a configuration change, not an application rewrite — filesystem access stays behind Laravel's Storage contract, which preserves our ability to swap backends later.
The important caveat is the era of the architecture. The package is a Flysystem v1 adapter, matching Laravel 5.x–8.x. Laravel 9+ moved to Flysystem v3 with a different adapter interface, and this package has had no release since 2022-03-02. So "architecture fit" is high for legacy Laravel estates and questionable-to-blocking for modern ones without a fork.
Integration feasibility
config/filesystems.php, set env credentials (QINIU_ACCESS_KEY, QINIU_SECRET_KEY, QINIU_BUCKET, QINIU_DOMAIN), then use Storage::disk('qiniu') exactly like the local disk.qiniu/php-sdk and the Flysystem v1 line. Composer conflicts with projects already on Flysystem 3 are the most likely first blocker.Storage::url() semantics).visibility, and multipart/large-file behavior through the Flysystem shim are the areas to probe in a spike rather than trust.Technical risk
| Risk | Severity | Notes |
|---|---|---|
| Flysystem v1 lock-in | High | Blocks Laravel 9/10/11 without a maintained fork or replacement adapter |
| Unmaintained since 2022 | High | No security patches; single-maintainer, community package |
| Qiniu SDK drift | Medium | Token/auth and API changes are absorbed by qiniu/php-sdk, but pinned versions age |
| Directory/visibility semantics | Medium | Emulated listing and private-bucket URL signing can surprise app code |
| Vendor concentration | Medium | Qiniu account, CDN domain and credentials become deployment-critical |
Key questions
Storage::url()?Stack fit
Good fit where the estate is Laravel 5.x–8.x and the product genuinely serves Chinese users or needs low-latency mainland delivery. In that context the package is the pragmatic "buy/borrow" choice at ~516 stars with an MIT license — no procurement friction, no licensing cost. For Laravel 9+ stacks it should be treated as incompatible by default until a spike proves otherwise; the realistic options are a small internal fork (port the adapter to Flysystem v3) or a maintained alternative Qiniu adapter.
Migration path
qiniu alongside existing disks, mirror a representative asset set, exercise put/get/delete/exists/url, private-bucket signing, and a >100 MB file.Storage::disk(config('filesystems.asset_disk')) indirection) so the driver is swappable without touching feature code.Compatibility
Confirm the matrix explicitly before committing: Laravel version ↔ Flysystem major ↔ qiniu/php-sdk version ↔ PHP version. The package's release date makes PHP 8.2/8.3 and Laravel 10/11 support unverified, not assumed. Treat dynamic properties/deprecations and any AdapterInterface mismatch as expected friction.
Sequencing
Spike → decision (adopt / fork / substitute) → staging proof → abstraction layer → asset backfill → cutover. Do not let feature teams code directly against Storage::disk('qiniu'); make the disk name configurable from day one so a later switch is a config change, not a refactor.
Maintenance
The dominant operational fact: last release 2022-03-02, community-maintained, no security-update cadence. A TPM should plan for ownership — either budget a small internal maintenance commitment (fork pinned in Composer, patch on demand) or accept the risk explicitly with a named owner and a documented exit trigger (e.g., first unpatched CVE or first Laravel upgrade blocker). MIT licensing makes forking legally trivial; the cost is engineering time, not legal.
Support
Community-only, Chinese-language docs and issues. Effective internal support depends on one or two engineers who understand Qiniu's console (bucket, domain, CDN, CORS) as well as the package. That is a bus-factor risk worth naming — plan knowledge transfer and runbook documentation.
Scaling
Scaling is largely Qiniu's problem, not the adapter's: the driver is a thin translation layer. Watch instead for client-side limits — listing very large prefixes through the emulated-directory shim, per-request token generation overhead, batch-operation throughput, and network latency/egress between app servers and Qiniu (especially cross-border). CDN configuration, not the package, determines user-facing performance.
Failure modes
url()/temporaryUrl() usage is consistent.composer update or Laravel upgrade breaks the disk; pin versions and gate upgrades in CI.Ramp-up
Low for Laravel developers — the Storage facade is familiar and the driver is drop-in. Moderate for the Qiniu console side (buckets, domains, CDN, CORS, signing) and for the migration scripting. Realistically a 1–2 day spike plus a 1–2 week integration/migration effort for a small team, dominated by compatibility verification and asset backfill rather than feature work.
TPM recommendation: adopt for legacy Laravel (≤8) estates with genuine China-delivery needs, behind a storage abstraction and with a named maintainer; treat modern Laravel targets as a fork-or-substitute decision, and set an explicit review trigger around Laravel upgrades and security posture. The low opportunity score (2.27) is consistent with this being a mature, narrow, region-specific niche — high utility inside its lane, limited strategic upside outside it.
How can I help you explore Laravel packages today?