This is gonna be a short one. I previously shared this as a tweet, but thought it would make a nice little blog post. Recently I had the need of having the configuration of my disks in Laravel (docs). I started tinkering with how I wanted to be able to configure it, then I realized I already had a clean way using PHP8's `match` expression (docs):
<?php // file: config/filesystems.php return [ // ... 'disks' => [ // ... 'logos' => match (env('APP_ENV')) { 'production' => [ 'driver' => 's3', 'key' => env('AWS_ACCESS_KEY_ID'), 'secret' => env('AWS_SECRET_ACCESS_KEY'), 'region' => env('AWS_DEFAULT_REGION'), 'bucket' => env('AWS_BUCKET'), 'url' => env('AWS_URL'), 'endpoint' => env('AWS_ENDPOINT'), 'throw' => false, ], default => [ 'driver' => 'local', 'root' => storage_path('app/logos'), 'url' => env('APP_URL').'/logos', 'visibility' => 'public', 'throw' => false, ], }, ], ];
Nice, isn't it? If I were only using a single `s3` disk, for instance, I could have described both env disks like so:
<?php // file: config/filesystems.php return [ // ... 'default' => env('FILESYSTEM_DISK', 'logos_local'), 'disks' => [ // ... 'logos_production' => [ 'driver' => 's3', 'key' => env('AWS_ACCESS_KEY_ID'), 'secret' => env('AWS_SECRET_ACCESS_KEY'), 'region' => env('AWS_DEFAULT_REGION'), 'bucket' => env('AWS_BUCKET'), 'url' => env('AWS_URL'), 'endpoint' => env('AWS_ENDPOINT'), 'throw' => false, ], 'logos_local' => [ 'driver' => 'local', 'root' => storage_path('app/logos'), 'url' => env('APP_URL').'/logos', 'visibility' => 'public', 'throw' => false, }, ], ];
Then I could swap the `FILESYSTEM_DISK` environment variable on each env, and it would technically work, as long as I used the Storage component without specifying the actual disk:
Storage::put(...) // vs. Storage::disk('logos')->put(...)
I tend to prefer having multiple, feature-specific disks, even if they are using the same S3 credentials and bucket and the only thing that changes between them is the `root` option (which determines the "base path" to where files are going to be stored in the S3 Bucket).
That's it. See you soon.