bengor-file/symfony-filesystem-bridge
Adapter bridge that makes BenGorFile/File objects compatible with Symfony’s Filesystem component. Install via Composer and use Symfony Filesystem operations while keeping the File library’s domain model. Includes PHPSpec test suite.
composer require bengor-file/symfony-filesystem-bridge
use BenGorFile\File\File;
use Symfony\Component\Filesystem\Filesystem;
$file = new File('/path/to/your/file.txt');
$filesystem = new Filesystem();
$adapter = new \BenGorFile\SymfonyFilesystemBridge\Adapter($file);
// Use the adapter with Symfony Filesystem methods
$filesystem->dumpFiles(['/target/path' => $adapter]);
Convert a BenGorFile\File object to a stream-compatible format for Symfony's Filesystem component:
$file = new File('/path/to/large-file.zip');
$adapter = new \BenGorFile\SymfonyFilesystemBridge\Adapter($file);
// Now use with Symfony's Filesystem methods
$fs = new Filesystem();
$fs->copy($adapter, '/backup/large-file.zip');
File Operations:
$adapter = new \BenGorFile\SymfonyFilesystemBridge\Adapter($file);
$fs = new Filesystem();
// Copy, move, or dump files
$fs->copy($adapter, '/destination/path');
$fs->move($adapter, '/new/location');
$fs->dumpFiles(['/target' => $adapter]);
Streaming Large Files:
$adapter = new \BenGorFile\SymfonyFilesystemBridge\Adapter($file);
$fs = new Filesystem();
// Stream directly without loading into memory
$fs->mirror('/source/dir', '/backup/dir', null, [
'delete' => true,
'override' => true,
'stream' => true,
'iterator' => new \BenGorFile\SymfonyFilesystemBridge\IteratorAdapter($adapter),
]);
Integration with Laravel:
use Illuminate\Support\Facades\Storage;
use Symfony\Component\Filesystem\Filesystem;
$file = Storage::disk('s3')->getAdapter()->readStream('file.txt');
$benGorFile = new File($file->getPathname());
$adapter = new \BenGorFile\SymfonyFilesystemBridge\Adapter($benGorFile);
$fs = new Filesystem();
$fs->dumpFiles(['/public/uploads' => $adapter]);
BenGorFile\File with Symfony's Filesystem component (e.g., in Laravel projects using Symfony's filesystem utilities).dumpFiles, mirror) for large files to avoid memory issues.IOException or FileNotFoundException:
try {
$fs->copy($adapter, '/destination');
} catch (\Symfony\Component\Filesystem\Exception\IOException $e) {
Log::error('File operation failed: ' . $e->getMessage());
}
Deprecated Package:
Streaming Limitations:
BenGorFile\File supports streaming. If the file is loaded entirely into memory, streaming operations may fail or behave unexpectedly.BenGorFile\File instances that don’t implement SeekableStreamInterface.Symfony Filesystem Assumptions:
Filesystem to handle the actual I/O. Misconfigurations (e.g., incorrect permissions) will propagate as Symfony exceptions.Check File Validity:
if (!$adapter->isReadable()) {
throw new \RuntimeException('File is not readable');
}
Log Adapter State:
\Log::debug('Adapter state:', [
'file_path' => $adapter->getPathname(),
'is_readable' => $adapter->isReadable(),
'size' => $adapter->getSize(),
]);
Fallback for Missing Methods:
If a method is missing (e.g., getMtime), implement a custom adapter extending \BenGorFile\SymfonyFilesystemBridge\Adapter:
class CustomAdapter extends \BenGorFile\SymfonyFilesystemBridge\Adapter {
public function getMtime() {
return $this->file->getMtime() ?: time();
}
}
Custom Adapters:
Extend the base adapter to add missing Symfony Filesystem interface methods:
class ExtendedAdapter extends \BenGorFile\SymfonyFilesystemBridge\Adapter {
public function getInode() {
return $this->file->getInode() ?: 0;
}
}
Iterator Support:
Use the provided IteratorAdapter for directory traversal:
$iterator = new \BenGorFile\SymfonyFilesystemBridge\IteratorAdapter($directoryAdapter);
foreach ($iterator as $fileAdapter) {
$fs->copy($fileAdapter, '/backup/' . $fileAdapter->getFilename());
}
Laravel Service Provider: Register the adapter as a Laravel service for global use:
use BenGorFile\SymfonyFilesystemBridge\Adapter;
public function register() {
$this->app->bind(\BenGorFile\SymfonyFilesystemBridge\Adapter::class, function () {
return new Adapter(new File(storage_path('app/file.txt')));
});
}
How can I help you explore Laravel packages today?