league/flysystem
Flysystem is a filesystem abstraction for PHP that lets you read, write, and manage files through a unified API across local disks and cloud storage (S3, FTP, SFTP, etc.). Swap adapters without changing app code, with consistent paths, streams, and visibility.
Strengths:
league/flysystem provides a unified interface for interacting with local and remote filesystems (S3, SFTP, FTP, GCS, Azure, etc.), aligning with Laravel’s dependency injection and service container patterns. This reduces vendor lock-in and simplifies future migrations.config/filesystems.php) and the Storage facade, enabling zero-boilerplate integration for most use cases.Weaknesses:
FilesystemAdapter (which can leverage cache drivers), flysystem requires manual integration with Laravel’s cache (e.g., for metadata caching).Storage facade already uses league/flysystem under the hood (via fruitcake/laravel-filesystem). No additional setup is needed for basic usage.FilesystemManager can register flysystem adapters dynamically.Storage::disk('s3')->put()) with flysystem’s Filesystem class for advanced features (e.g., checksums, async operations).Storage facade remains unchanged; flysystem enhances capabilities rather than replacing core functionality.config/filesystems.php to include flysystem-specific options (e.g., visibility for S3, disconnect_on_destroy for SFTP).filesystem.creating, filesystem.deleting) to hook into flysystem operations.flysystem’s async adapters (e.g., AsyncAwsS3) for background file processing in Laravel queues.AsyncAwsS3) must be tested under high load to validate chunking and retry logic.Storage facade for core operations and flysystem for advanced features, isolating risk.flysystem operations with Laravel’s logging/monitoring (e.g., track checksum failures, async job retries).flysystem’s abstraction is a clear win.AsyncAwsS3) and Laravel queue integration.flysystem’s stat method).flysystem supports checksums, but logging may require custom middleware.Storage facade? Prioritize use cases where flysystem adds value (e.g., checksums, async ops).spatie/laravel-medialibrary)? Audit dependencies for compatibility.flysystem’s modular design makes this easy.Storage::disk('s3')->put() for basic operations; leverage flysystem for advanced features via direct instantiation:
use League\Flysystem\Filesystem;
use League\Flysystem\Adapter\AwsS3v3\AwsS3V3Adapter;
$adapter = new AwsS3V3Adapter($client, 'bucket', 'prefix');
$filesystem = new Filesystem($adapter);
$checksum = $filesystem->checksum('file.txt'); // Advanced feature
$this->app->singleton('flysystem.s3', fn() => new Filesystem(
new AwsS3V3Adapter($this->app['aws'], 'bucket', 'prefix')
));
AsyncAwsS3) for background processing:
use League\Flysystem\AsyncAwsS3\AsyncAwsS3Adapter;
$adapter = new AsyncAwsS3Adapter($queue, $client, 'bucket');
$filesystem = new Filesystem($adapter);
$filesystem->write('file.txt', 'content'); // Processed asynchronously
dispatch(new ProcessFileJob($filesystem, 'file.txt'));
flysystem operations:
Storage::disk('s3')->addListener('afterWrite', function ($event) {
$filesystem = resolve('flysystem.s3');
$filesystem->checksum($event->path);
});
Storage facade for all operations. No code changes required.flysystem for Advanced Features (2-4 weeks)
flysystem for:
Filesystem::checksum()).Filesystem::temporaryUrl()).AsyncAwsS3Adapter).// Before (Laravel)
Storage::disk('s3')->put('file.txt', $content);
// After (flysystem)
$filesystem = resolve('flys
How can I help you explore Laravel packages today?