azure-oss/storage-blob-laravel
Azure Blob Storage filesystem driver for Laravel. Register an Azure container as a disk and use Laravel's Storage facade to upload, download, list, delete files, and generate URLs with familiar APIs—no custom SDK code required.
Architecture fit. The package is a thin Laravel service-provider wrapper that registers an Azure Blob Storage driver with Laravel's Flysystem-backed Storage facade. Architecturally this is the right shape: it keeps object storage behind Laravel's existing Storage::disk() abstraction, so application code stays portable and the driver is swappable at the config layer. For any Laravel workload already hosting on Azure (App Service, AKS, Container Apps, VMs in-VNet) this closes a real gap, since Laravel ships first-party drivers for local, S3, and SFTP but not Azure Blob.
Integration feasibility. Composer-installable, MIT-licensed, auto-discovered service provider, configured via a new disk entry in config/filesystems.php plus environment variables (account name, key or SAS, container, endpoint suffix). A single-disk pilot is a sub-day effort for a competent Laravel engineer. The dependency surface is the real question: it pulls the Azure Blob PHP SDK, so its useful compatibility window is bounded by two moving targets — Laravel major versions and the Azure SDK — not by the package's own code.
Technical risk.
Storage::url() semantics, temporary URL generation (SAS-based rather than presigned), and directory-listing performance will not behave identically to the S3 driver. Hierarchical-namespace (ADLS Gen2) accounts change several of these behaviors again.Key questions.
DefaultAzureCredential, or only key and SAS?Stack fit. Best fit is a Laravel 10/11/12 application deployed on Azure that already uses, or plans to use, Blob Storage for user uploads, document archives, or media. It is a poor fit if the application is S3-native and merely experimenting, or if it depends heavily on S3-specific semantics (ACLs, presigned PUT policies, S3 event notifications wired to app logic).
Migration path. Treat it as a new disk rather than a replacement:
azure next to local/s3), with credentials sourced from Key Vault or App Configuration, not committed .env files.exists, url, temporaryUrl, files/allFiles listing at depth, deleteDirectory, and one large-file upload. Compare results side by side with the incumbent disk.Compatibility. The two hard constraints are Laravel major-version support and Azure SDK version pinning. If your application is on a Laravel version the package has not been updated for, the honest options are: pin Laravel, vendor and patch the driver, or use an alternative adapter. Note that the League's own Flysystem Azure adapter plus a small custom service provider is a viable fallback and gives you first-party-adjacent maintenance with your own thin glue.
Sequencing. Do the compatibility spike and auth-mode decision first — both are potential stop-the-project findings. Parity testing second. Production disk enablement third, behind a feature flag. Only then migrate existing objects and decommission the old path.
Maintenance. Assume you own this code eventually. Budget for a fork-and-patch contingency: the license permits it, and the code is small enough that a mid-level Laravel engineer can read it end to end in a day. Add a recurring task to check upstream activity before each Laravel upgrade, because that is when an unmaintained driver breaks.
Support. No vendor SLA and a small community. Internalize troubleshooting: Azure throttling (429/503), auth failures from expired SAS tokens, and container-not-found errors will be your top three incident classes. Write runbook entries for each before go-live.
Scaling. Blob Storage scales far beyond what most Laravel apps need; the driver is not the bottleneck. Real limits are listing performance on large containers (paginated, latency-bound — cache directory listings), per-request memory on large uploads, and egress cost if the app tier and storage account are not co-located. Place the app and storage account in the same region and use private endpoints to avoid public-egress charges and latency.
Failure modes.
Ramp-up. Low for application developers — the Storage facade API is unchanged, so the learning curve is config and credential handling, not code. Higher for platform/ops: Azure RBAC, private endpoints, SAS lifetimes, and lifecycle rules are new operational surface. Plan roughly one engineer-day for the integration spike plus two to three days for parity testing and runbook authoring; add security review time if the auth mode turns out to be key-based.
How can I help you explore Laravel packages today?