Laravel has no native WebDAV server — so I built one

php dev.to

🚀 I’ve just released the first alpha version of my Laravel WebDAV server:

👉 https://github.com/N3XT0R/laravel-webdav-server/releases/tag/1.0.0-alpha.1


⚠️ Disclaimer

This is an early alpha prototype.

It is:

  • not stable
  • not production-ready
  • subject to breaking changes at any time

The current focus is on architecture and extensibility, not completeness.


The problem

In the Laravel ecosystem, there is currently no truly native WebDAV server solution.

Most existing approaches fall into one of two categories:

  • Thin wrappers around SabreDAV with limited Laravel integration
  • WebDAV client adapters (e.g. for Storage::disk()), not actual servers

What’s missing is a solution that:

  • integrates cleanly into Laravel’s architecture
  • respects existing auth and authorization concepts
  • works naturally with Laravel’s filesystem abstraction (Flysystem)

The idea

This package aims to bridge the gap between the WebDAV protocol and Laravel’s filesystem abstraction.

Instead of exposing raw filesystem paths, it maps WebDAV nodes directly to Laravel disks.

That means you can expose:

  • local storage
  • S3 buckets
  • or any Flysystem-backed disk

through a WebDAV endpoint.


What makes this different

1. Native Laravel integration

This is not a standalone WebDAV server bolted onto Laravel.

It is designed to feel like a first-class Laravel component.


2. Explicit request pipeline (no magic)

Every request follows a clearly defined flow:

Controller → Factory → Credential Validation → Space Resolution → Authorization → Storage

There is:

  • no hidden magic
  • no black box
  • no implicit behavior

Every step is transparent and replaceable.


3. Clear separation of concerns

The architecture strictly separates:

  • WebDAV transport (SabreDAV)
  • Application logic (Laravel)
  • Storage (Flysystem)

4. Pluggable architecture

Core components are abstracted via interfaces:

  • Credential validation
  • Storage space resolution
  • Path-level authorization

All bindings use bindIf(), so you can override them without modifying package code.


5. Policy-native authorization

Authorization integrates directly with Laravel’s Gate and Policies.


6. Dynamic storage mapping

Storage is resolved at runtime based on:

  • user (principal)
  • route parameter {space}

What this package is (and is not)

✔ WebDAV server for Laravel (HTTP endpoint)

✖ Not a Storage::disk('webdav') client driver


Current feature set

  • WebDAV server powered by SabreDAV
  • Mapping of WebDAV nodes to Laravel filesystem disks
  • Pluggable authentication (Basic Auth by default)
  • Flexible storage space resolution
  • Extensible authorization layer
  • Clean extension points via interfaces

Supported operations

  • PROPFIND
  • GET
  • PUT
  • DELETE
  • MKCOL

What’s missing

  • Stability
  • Edge case handling
  • Production readiness

Why release this early?

Because the architecture is the most important part.


Feedback welcome

I’d really appreciate:

  • architectural feedback
  • edge cases I haven’t considered
  • ideas for real-world use

GitHub

👉 https://github.com/N3XT0R/laravel-webdav-server/releases/tag/1.0.0-alpha.1


Hashtags

laravel #php #webdav #opensource #softwarearchitecture #backend #api #flysystem

Source: dev.to

arrow_back Back to Tutorials