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:
- 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();
}
}
- 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;
});
}
}
- Update your
config/media-library.phpto 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}.