Consolidate media disk config into AppConfigProvider

Remove duplicate configureMediaDisk() from AppServiceProvider — all
FileDisk and media-library config is now in AppConfigProvider's
configureFileSystemFromDatabase().

Replace setConfig() calls with inline config registration everywhere
to avoid mutating filesystems.default, which caused infinite request
loops on the File Disk admin page.
This commit is contained in:
Darko Gjorgjijoski
2026-04-07 01:09:06 +02:00
parent 6dd9ed1232
commit ea1fc9b799
3 changed files with 30 additions and 45 deletions

View File

@@ -27,8 +27,18 @@ class MigrateMediaToPrivateDisk extends Command
$prefix = env('DYNAMIC_DISK_PREFIX', 'temp_');
$targetDiskName = $prefix.$targetDisk->driver;
$targetDisk->setConfig();
$targetRoot = config('filesystems.disks.'.$targetDiskName.'.root');
// Register disk config without mutating filesystems.default
$credentials = collect(json_decode($targetDisk->credentials));
$baseConfig = config('filesystems.disks.'.$targetDisk->driver, []);
foreach ($baseConfig as $key => $value) {
if ($credentials->has($key)) {
$baseConfig[$key] = $credentials[$key];
}
}
config(['filesystems.disks.'.$targetDiskName => $baseConfig]);
$targetRoot = $baseConfig['root'] ?? null;
if (! $targetRoot) {
$this->error('Could not resolve target disk root path.');

View File

@@ -163,15 +163,30 @@ class AppConfigProvider extends ServiceProvider
protected function configureFileSystemFromDatabase(): void
{
try {
// Get the default file disk from database
// Register the default file disk config without changing filesystems.default.
// Calling setConfig() mutates the global default which causes side effects
// on pages that make multiple API requests (e.g., File Disk admin page).
$fileDisk = FileDisk::whereSetAsDefault(true)->first();
if ($fileDisk) {
$fileDisk->setConfig();
$prefix = env('DYNAMIC_DISK_PREFIX', 'temp_');
$diskName = $prefix.$fileDisk->driver;
$credentials = collect(json_decode($fileDisk->credentials));
$baseConfig = config('filesystems.disks.'.$fileDisk->driver, []);
foreach ($baseConfig as $key => $value) {
if ($credentials->has($key)) {
$baseConfig[$key] = $credentials[$key];
}
}
config(['filesystems.disks.'.$diskName => $baseConfig]);
// Point Spatie Media Library at the same disk
config(['media-library.disk_name' => $diskName]);
}
} catch (\Exception $e) {
// Silently fail if database is not available (during installation, migrations, etc.)
// This prevents the application from breaking during setup
}
}
}

View File

@@ -2,8 +2,6 @@
namespace App\Providers;
use App\Models\FileDisk;
use App\Models\Setting;
use App\Policies\CompanyPolicy;
use App\Policies\CustomerPolicy;
use App\Policies\DashboardPolicy;
@@ -59,7 +57,6 @@ class AppServiceProvider extends ServiceProvider
if (InstallUtils::isDbCreated()) {
$this->addMenus();
$this->configureMediaDisk();
}
Gate::policy(Role::class, RolePolicy::class);
@@ -169,41 +166,4 @@ class AppServiceProvider extends ServiceProvider
{
Broadcast::routes(['middleware' => 'api.auth']);
}
/**
* Configure Spatie Media Library to use the FileDisk system.
*
* Resolves the media disk from the `media_disk_id` setting,
* falling back to the default FileDisk. This ensures media
* uploads go to a private disk by default.
*/
private function configureMediaDisk(): void
{
try {
$mediaDiskId = Setting::getSetting('media_disk_id');
$disk = $mediaDiskId
? FileDisk::find($mediaDiskId)
: FileDisk::where('set_as_default', true)->first();
if ($disk) {
// Register the disk config without changing the global default.
// setConfig() mutates filesystems.default which causes side effects.
$prefix = env('DYNAMIC_DISK_PREFIX', 'temp_');
$diskName = $prefix.$disk->driver;
$credentials = collect(json_decode($disk->credentials));
$baseConfig = config('filesystems.disks.'.$disk->driver, []);
foreach ($baseConfig as $key => $value) {
if ($credentials->has($key)) {
$baseConfig[$key] = $credentials[$key];
}
}
config(['filesystems.disks.'.$diskName => $baseConfig]);
config(['media-library.disk_name' => $diskName]);
}
} catch (\Exception $e) {
// DB not yet migrated or settings table missing — use config default
}
}
}