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

Laravel Webdav Laravel Package

pbmedia/laravel-webdav

Laravel WebDAV adds a WebDAV filesystem driver to Laravel, making it easy to list, read, write, and delete files on remote WebDAV servers through Laravel's familiar Storage API and Flysystem integration.

View on GitHub
Deep Wiki
Context7

Technical Evaluation

Architecture fit

  • The package is a thin glue layer: it registers a webdav Flysystem adapter on Laravel's Storage facade, backed by sabre/dav's WebDAV client. Architecturally this is exactly the right shape for Laravel — remote WebDAV endpoints become interchangeable disks (Storage::disk('webdav')) and inherit the facade's convenience methods, path normalization, and test-friendly fakes.
  • Conceptually it fits any stack that already treats Laravel's filesystem abstraction as the seam between application code and storage location. If your code is written against Storage and not against League\Flysystem directly, a WebDAV disk is a config change, not a refactor.
  • The strategic value is in the pattern, not the package. The pattern is ~200 lines of adapter wiring that is trivially reproducible; the package is a convenience wrapper that has barely moved.
  • 1.11.0 does not change this. The release is housekeeping only — PHP 8.1 support, and drops of PHP 7.3, Laravel 6, and Laravel 7. No new adapter capability, no new disk options, no compatibility work against Flysystem v3. The architectural read stands unchanged.

Integration feasibility

  • Low effort to prototype, high effort to own. composer require pbmedia/laravel-webdav will resolve cleanly only on the Laravel 8 / Flysystem v1 generation. Laravel 9 re-bases the filesystem layer on Flysystem v3 (league/flysystem ^3.0), and this package's constraints almost certainly still pin v1. Expect a hard Composer conflict, not a runtime warning — which is at least a fast, unambiguous failure.
  • 1.11.0 sharpens this rather than relieving it. Dropping Laravel 6 and 7 means the supported matrix is now narrower: effectively Laravel 8 only, on PHP 8.0/8.1. That is a maintenance signal, not a modernization signal — the maintainer pruned EOL versions without migrating the adapter to the current Laravel filesystem layer. Anyone on Laravel 9+ is no closer to a working install than before.
  • Note the versioning: dropping framework and runtime support inside a 1.x minor release is a compatibility break delivered under a non-breaking version number. Composer will protect consumers (^1.10 on a Laravel 7 app will simply refuse 1.11.0 and stay pinned), but it means an unpinned composer update is a matrix-changing event, not a routine bump. Pin explicitly if you use it at all.
  • Because it is MIT, forking is legally and technically unencumbered. The fork work is bounded: bump the Flysystem constraint, port the adapter to the v3 FilesystemAdapter interface (writeStream, readStream, listContents returning DirectoryListing, Visibility handling), and confirm the Storage::extend registration still works. The 1.11.0 release doesn't reduce any of that effort.
  • The lower-risk feasibility path remains to skip the fork and consume league/flysystem-webdav (the maintained v3 WebDAV adapter) directly, wiring it through a custom disk driver in a service provider. This trades ~1 day of glue work for a maintained dependency.

Technical risk

  • Maintenance risk: high, marginally softened. 1.11.0 proves the maintainer is alive and willing to do version-hygiene work — that is a genuine improvement over a fully dormant artifact and it de-risks the near term. It does not establish an upgrade path to the current Laravel filesystem layer, a security-response commitment, or a roadmap. Treat "maintained" as "periodically dusted," not "actively developed."
  • Abstraction-leak risk: medium-high. WebDAV is not S3. Semantics diverge on: atomicity of move/rename (server-dependent, no two-phase commit), directory listing cost (a recursive allFiles() translates into many PROPFIND round trips), and visibility/permissions (Visibility::PUBLIC/PRIVATE is largely meaningless on most WebDAV servers). 1.11.0 addresses none of this.
  • Transport risk: medium. The underlying client is synchronous, blocking, per-operation HTTP with no connection reuse guarantees. There is no chunked upload support, so a single large file write is one long-lived PUT that will hit PHP max_execution_time, proxy idle timeouts, or server body-size limits depending on endpoint configuration.
  • Compatibility risk: high, concentrated. Behavior varies sharply across Nextcloud/ownCloud, Apache mod_dav, Box, and SharePoint's WebDAV front end — differing on auth schemes, redirect handling, path escaping, and lock semantics. The package offers no compatibility matrix, and 1.11.0 does not add one. Note also that PHP 8.1 support is claimed but unverified against the v1-era Flysystem stack; deprecation noise on 8.1 is plausible and worth a five-minute smoke test before relying on it.
  • Data freshness caveat: no updated registry metrics accompanied this release. The prior scoring (0.76 / opportunity 15.62, 65 stars, zero recorded dependents) should be treated as stale; a maintenance release may nudge adoption signals but not enough to change the decision.
  • Overall: still "sound idea, thinly-maintained artifact." 1.11.0 shifts the verdict from dead to hibernating, which is not enough to justify a new integration on Laravel 9+.

Key questions

  1. Which WebDAV server and version is on the other end, and is it a system of record or a handoff/landing zone?
  2. What is the largest single file we must move, and does the target support chunked upload or MKCOL-based segmentation?
  3. Which Laravel version is the target? If ≥9, the answer effectively pre-decides fork-vs-replace — and 1.11.0 did not move that line.
  4. Is the consumer code written against Storage (portable) or against this package's internals (locked in)?
  5. What auth does the endpoint require — Basic, Digest, Bearer, or OAuth-wrapped (SharePoint)? This alone can invalidate the adapter.
  6. Are reads and writes in the request path (user-facing latency) or in queued jobs (tolerant of seconds)?
  7. Does 1.11.0 actually install and run green on PHP 8.1 against our target Laravel 8 app — has anyone verified, or is "supports PHP 8.1" a constraint bump only?
  8. Who owns the fork or the driver, and is there a funded alternative (S3-compatible gateway in front of the WebDAV store)?

Integration Approach

Stack fit

  • Strong fit at the design level, weak at the artifact level. The right framing is unchanged: adopt the driver pattern, reimplement or re-source the implementation.
  • Recommended target state: a small internal package or service provider that registers a webdav disk via Storage::extend, backed by league/flysystem-webdav (v3) + sabre/dav. This preserves the exact ergonomics of the original while sitting on maintained dependencies, and it is what a fork of this package would converge to anyway.
  • If Laravel 8 is genuinely the target, this package is now more clearly the right choice within that lane — 1.11.0 makes it PHP 8.1-compatible, which is a real win if the surrounding app has already moved to 8.1. Use it as-is there, pinned. But pinning a new integration to an adapter that has not crossed the Flysystem v3 line is a decision that should be made explicitly, not by default.

Migration path

  1. Day 1–2, spike: in a throwaway branch, attempt the direct dependency on the actual target Laravel/PHP pair. Confirm the Composer conflict exists rather than assuming it. On Laravel 8 + PHP 8.1 you may now get a clean install where you previously wouldn't — which is worth knowing either way.
  2. Day 2–3, replacement build: implement the Storage::extend('webdav', ...) driver against league/flysystem-webdav. Keep the disk name webdav so no application code changes.
  3. Config parity: expose the same config keys the package used (baseUri, userName, password, plus TLS/proxy options) so config/filesystems.php diffs are minimal.
  4. Contract tests: write a conformance suite against the disk covering put/get/exists/delete/files/allFiles/move/copy plus a large-file case. Run it against the real endpoint. This is the artifact that de-risks the whole integration.
  5. Retire the fork question: if step 2 succeeds within the spike budget, do not fork the original at all. Archive the decision with a note. If you are staying on Laravel 8, record "pinned to 1.11.x, revisit at Laravel 9" instead.

Compatibility

  • Flysystem v3 is the cliff, and 1.11.0 did not cross it. Anything Laravel 9+ requires the replacement path; treat the original package as documentation of intent.
  • Support matrix as of 1.11.0: PHP 8.0/8.1 (8.1 newly supported, 7.3 dropped), Laravel 8 only (6 and 7 dropped). Anything outside that is unsupported, not merely untested.
  • Server compatibility must be established empirically per endpoint: verify PROPFIND depth behavior, path escaping on names with spaces/unicode, 423 Locked handling, and behavior behind a reverse proxy with self-signed TLS.
  • Auth compatibility gate: if the endpoint needs Digest, NTLM, or OAuth, confirm sabre/dav supports it before committing — this is the most common late-breaking blocker.

Sequencing

  • Phase 1: endpoint reconnaissance (server type, auth, size limits, proxy/TLS posture).
  • Phase 2: spike + conformance suite (proves or kills the approach cheaply) — now including a PHP 8.1 smoke run, since that claim is new.
  • Phase 3: driver implementation behind the Storage facade, disk name unchanged.
  • Phase 4: migrate call sites off any package-specific APIs onto the facade.
  • Phase 5: cut over in a non-critical path (exports, backups, document handoff) before any user-facing flow.

Operational Impact

Maintenance

  • 1.11.0 is a meaningful but limited positive: there is now evidence of a living maintainer, which restores a theoretical path for a bug report or a PHP-version fix. It does not restore a path to Laravel 9.
  • The maintenance burden is still effectively yours. Budget a small but permanent allocation (~1–2 days per framework major upgrade) to re-verify the driver — and note that 1.11.0 is precisely the shape of the problem: an entire framework generation was dropped, and the adapter still doesn't support the current one.
  • The replacement path shifts this burden to league/flysystem-webdav and sabre/dav, both actively maintained. That remains the entire operational argument for replacement: you move from "we own a thinly-maintained adapter" to "we consume a maintained adapter and own only config."

Support

  • No vendor, no SLA. Support is internal: whoever writes or pins the driver owns it. Escalation for server-side issues lands with the WebDAV provider's team, not with the package.
  • Mitigation: the conformance suite doubles as the support runbook. When something breaks, the suite localizes the failure to auth, listing, transfer, or mutation in minutes rather than hours.
  • Document the endpoint contract (server version, auth, limits) and the pinned package version in the repo — this is the knowledge that walks out the door otherwise.

Scaling

  • Scaling is the weak dimension and 1.11.0 does nothing for it. Every operation is a blocking HTTP round trip; there is no connection pooling, no batching, and no async. Throughput scales with worker count, not with the package.
  • Directory traversal is the hidden cost: allFiles() on a deep tree fans out into many PROPFIND calls and can dominate latency. Cache listings, or avoid recursive enumeration in request paths entirely.
  • No chunked/resumable upload means large files are single long-lived requests. Move them to queued jobs with generous timeouts, or push them out of band and record a reference in the app.
  • Practical ceiling: fine for config, templates, exports, and document handoff at moderate volume. Not appropriate as primary storage for a high-write or large-object workload.

Failure modes

  • Auth drift: credential rotation or scheme mismatch surfaces as 401 (or 407 behind a proxy) — usually the first symptom in production.
  • Timeout / partial write: long PUTs interrupted mid-flight leave ambiguous state; WebDAV gives no transactional guarantee and rename atomicity is server-dependent. Treat writes as at-least-once and make consumers idempotent.
  • Lock contention: 423 Locked from Office/desktop clients or concurrent writers; needs retry-with-backoff, not immediate failure.
  • Quota: 507 Insufficient Storage — must be distinguished from a generic 5xx so alerting is meaningful.
  • Silent listing skew: servers that truncate or reorder PROPFIND results produce incomplete enumerations that look like success. Assert on counts in the conformance suite.
  • TLS/proxy: self-signed certs and reverse proxies cause failures that only reproduce in one environment; pin this down before launch.
  • Dependency drift (new): with 1.11.0 the package now declares a narrower framework/runtime range. An unpinned composer update on a mixed-version fleet can silently split the matrix — some apps resolve 1.11.0, others stay on 1.10.x — producing environment-specific behavior differences. Pin the exact version.
  • Blast radius: because the disk name is shared, a driver bug affects every consumer at once. Isolate by disk name per integration where feasible.

Ramp-up

  • Engineering ramp-up is low: any Laravel developer who knows Storage can use the disk in an hour. The interface is the framework's, not the package's — that is the package's real contribution.
  • The non-obvious ramp-up is WebDAV semantics and endpoint quirks, which no amount of package familiarity provides. Front-load that with the Phase 1 recon and the conformance suite.
  • Estimate: ~1 day to a working prototype, ~3–5 days to a production-grade driver with tests and documented failure handling, assuming the endpoint is cooperative. Add a week if auth is exotic or the server is SharePoint.
  • Bottom line: 1.11.0 changes the tone of the assessment, not its conclusion. The package is awake, narrowly, and is now a reasonable pinned choice for a Laravel 8 / PHP 8.1 estate. For anything on Laravel 9+, it remains a specification and a spike, not a dependency — fund the two-day replacement build early, and pin the version explicitly if you use it.
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.
adachsoft/changelog-linter
adachsoft/collection
payerurl/telegrambot-crypto-payment-instant-payout
dskripchenko/laravel-hybrid-search
riorizkyrainey/lara-ced
mehedimi/static-vel
zharp/zharp
nonsapiens/bigquery-model-sync
lgu-bayambang-ict-office/lgu-laravel-development-standards
andydefer/laravel-support
se7enxweb/flysystem
lampwick/laravel
jeslage/statamic-emojis
micahdshackelford/rmap-laravel
draftsmaninc/draftsman
square-bit/laravel-volition
himito/laravel-mailman
htinlynn/genius-helper
maco-studios/hephaestus
elmogy/larafast