Skip to main content

Migrate from matthewbdaly/laravel-azure-storage

azure-oss/storage-blob-laravel is the replacement for matthewbdaly/laravel-azure-storage.

If you only remember one thing from this guide, make it this: the visible Laravel change is small, but the underlying stack changes completely. That is good news, as long as you migrate it in the right order.

What changes

AreaOld packageazure-oss/storage-blob-laravel
Disk driverazureazure-storage-blob
Flysystem layerOld League Azure adapterazure-oss/storage-blob-flysystem
Blob SDK underneathmicrosoft/azure-storage-blobazure-oss/storage-blob
Shared-key configname, key, containeraccount_name, account_key, container
Token-based authNot first-classclient_secret, client_certificate, workload_identity, managed_identity
URL controlsurlurl, temporary_url, is_public_container

A safe migration path

1. Replace the package

composer remove matthewbdaly/laravel-azure-storage
composer require azure-oss/storage-blob-laravel

2. Change the driver name

Replace:

'driver' => 'azure',

with:

'driver' => 'azure-storage-blob',

3. Start with the simplest viable config

If you already have a working Azure Storage connection string, keep the first version of the new disk very small:

'azure' => [
'driver' => 'azure-storage-blob',
'connection_string' => env('AZURE_STORAGE_CONNECTION_STRING'),
'container' => env('AZURE_STORAGE_CONTAINER'),
'url' => env('AZURE_STORAGE_URL'),
],

That gets you onto the new package without forcing an auth redesign on day one.

4. Translate the legacy shared-key fields if needed

Old config often looks like this:

'azure' => [
'driver' => 'azure',
'name' => env('AZURE_STORAGE_NAME'),
'key' => env('AZURE_STORAGE_KEY'),
'container' => env('AZURE_STORAGE_CONTAINER'),
'url' => env('AZURE_STORAGE_URL'),
'prefix' => null,
'connection_string' => env('AZURE_STORAGE_CONNECTION_STRING'),
],

The equivalent explicit shared-key form is:

'azure' => [
'driver' => 'azure-storage-blob',
'credential' => 'shared_key',
'account_name' => env('AZURE_STORAGE_ACCOUNT_NAME'),
'account_key' => env('AZURE_STORAGE_ACCOUNT_KEY'),
'container' => env('AZURE_STORAGE_CONTAINER'),
],

Field mapping:

  • name -> account_name
  • key -> account_key
  • sasToken -> use a SAS-bearing connection_string

5. Re-test the parts Laravel apps notice first

Prioritize:

  • Storage::put()
  • Storage::get()
  • Storage::url()
  • Storage::temporaryUrl()
  • any custom origin behavior through url or temporary_url

If those are stable, the migration is usually in very good shape.

6. Only then decide whether to modernize auth

Once the new disk is behaving in production, decide whether to keep:

  • connection_string
  • shared_key

or move forward to:

  • client_secret
  • client_certificate
  • workload_identity
  • managed_identity

That second phase is where the long-term security improvements really show up.

What gets better

  • one maintained Blob stack all the way from Laravel down to the SDK
  • better support for modern Laravel versions
  • a cleaner split between public URLs and signed temporary URLs
  • stronger options for Azure-native authentication

Migration checklist

  • Replace the package
  • Rename the disk driver to azure-storage-blob
  • Prefer a connection string for the first rollout
  • Map legacy shared-key fields if you do not use a connection string
  • Re-test URL generation carefully
  • Modernize auth only after the disk behavior is stable

Keep reading