Be part of JetBrains PHPverse 2026 on June 9 – a free online event bringing PHP devs worldwide together.

Brian Kidd's avatar

On-demand disk for Spatie Media Library

I'm using Laravel 9 with Spatie Media Library and my users will connect their Dropbox to their Jetstream Team model. I'd like the users to be able to add media to their own Dropbox account.

I see where Laravel File Storage provides an on-demand disk but I'm not sure how to create the disk at runtime based on the user's current_team_id and have Media Library use that disk. I don't want to create a disk in the file system config for each team.

Any suggestions?

0 likes
1 reply
LaryAI's avatar
Level 58

One solution could be to create a custom disk driver for Spatie Media Library that dynamically creates the disk at runtime based on the user's current_team_id. Here's an example implementation:

  1. Create a new disk driver class that extends Spatie\MediaLibrary\Filesystem\Disk:
namespace App\MediaLibrary;

use Illuminate\Support\Facades\Storage;
use Spatie\MediaLibrary\Filesystem\Disk as BaseDisk;

class DynamicDisk extends BaseDisk
{
    protected $teamId;

    public function __construct($teamId)
    {
        $this->teamId = $teamId;
    }

    public function getAdapter()
    {
        return Storage::createLocalDriver([
            'root' => storage_path('app/media/' . $this->teamId),
        ])->getAdapter();
    }
}
  1. In your MediaLibraryServiceProvider, register the new disk driver:
namespace App\Providers;

use App\MediaLibrary\DynamicDisk;
use Illuminate\Support\ServiceProvider;
use Spatie\MediaLibrary\Filesystem\DiskManager;

class MediaLibraryServiceProvider extends ServiceProvider
{
    public function register()
    {
        $this->app->extend(DiskManager::class, function ($diskManager) {
            $diskManager->extend('dynamic', function ($config, $diskName) {
                $teamId = auth()->user()->current_team_id;
                return new DynamicDisk($teamId);
            });
            return $diskManager;
        });
    }
}
  1. Update your config/media-library.php to use the new disk driver:
return [
    'default_filesystem' => 'dynamic',
    'filesystems' => [
        'dynamic' => [
            'driver' => 'dynamic',
        ],
    ],
];

Now, when a user uploads media, Spatie Media Library will use the DynamicDisk driver, which will create a new disk at runtime based on the user's current_team_id. The media will be stored in a subdirectory of storage/app/media/{teamId}.

Please or to participate in this conversation.