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.
Architecture fit
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.Storage and not against League\Flysystem directly, a WebDAV disk is a config change, not a refactor.Integration feasibility
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.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.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.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
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.max_execution_time, proxy idle timeouts, or server body-size limits depending on endpoint configuration.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.Key questions
MKCOL-based segmentation?Storage (portable) or against this package's internals (locked in)?Stack fit
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.Migration path
Storage::extend('webdav', ...) driver against league/flysystem-webdav. Keep the disk name webdav so no application code changes.baseUri, userName, password, plus TLS/proxy options) so config/filesystems.php diffs are minimal.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.Compatibility
PROPFIND depth behavior, path escaping on names with spaces/unicode, 423 Locked handling, and behavior behind a reverse proxy with self-signed TLS.sabre/dav supports it before committing — this is the most common late-breaking blocker.Sequencing
Storage facade, disk name unchanged.Maintenance
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
Scaling
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.Failure modes
401 (or 407 behind a proxy) — usually the first symptom in production.423 Locked from Office/desktop clients or concurrent writers; needs retry-with-backoff, not immediate failure.507 Insufficient Storage — must be distinguished from a generic 5xx so alerting is meaningful.PROPFIND results produce incomplete enumerations that look like success. Assert on counts in the conformance suite.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.Ramp-up
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.How can I help you explore Laravel packages today?