durimjusaj/knp-gaufrette-bundle
Install the Bundle & Adapters
composer require knplabs/knp-gaufrette-bundle gaufrette gaufrette/adapter-local
(Replace gaufrette/adapter-local with your preferred adapter, e.g., gaufrette/adapter-aws for S3.)
Configure the Bundle
Add to config/packages/knp_gaufrette.yaml:
knp_gaufrette:
adapters:
my_adapter:
local:
directory: '%kernel.project_dir%/var/files'
filesystems:
my_filesystem:
adapter: my_adapter
First Use Case: Upload a File
use Knp\Bundle\GaufretteBundle\FilesystemMap;
use Gaufrette\Filesystem;
public function uploadFile(FilesystemMap $filesystemMap, UploadedFile $file) {
$fs = $filesystemMap->get('my_filesystem');
$fs->write('path/to/file.txt', $file->getContent());
}
config/packages/knp_gaufrette.yaml (Default config structure)Filesystem Abstraction
Use FilesystemMap to switch between adapters (e.g., local dev → AWS prod) without code changes:
$fs = $filesystemMap->get('my_filesystem');
$fs->writeStream('large_file.zip', fopen('local/path.zip', 'r'));
Streaming Large Files
Avoid memory issues with writeStream()/readStream():
$fs->writeStream('video.mp4', fopen('video_source.mp4', 'r'));
Metadata Handling
Use getMetadata()/setMetadata() for custom attributes:
$metadata = $fs->getMetadata('file.txt');
$fs->setMetadata('file.txt', ['user_id' => 123]);
Gaufrette\File\File to form fields for direct uploads.league/flysystem-gaufrette to integrate with Flysystem-based packages.FilesystemEvents (e.g., preWrite, postDelete) for logging/auditing.# config/packages/knp_gaufrette.yaml
knp_gaufrette:
adapters:
local:
local:
directory: '%kernel.project_dir%/var/files'
s3:
aws:
bucket: 'my-bucket'
prefix: 'uploads/'
filesystems:
dev:
adapter: local
prod:
adapter: s3
Adapter-Specific Quirks
directory is writable (chmod 777 if needed).knp_gaufrette.yaml or environment variables:
aws:
key: '%env(AWS_KEY)%'
secret: '%env(AWS_SECRET)%'
region: 'eu-west-1'
ftp://user:pass@host:port/path in directory config.Caching Issues
Clear Symfony cache after changing knp_gaufrette.yaml:
php bin/console cache:clear
File Permissions
Gaufrette doesn’t handle permissions—configure via OS (e.g., chmod) or adapter (e.g., AWS ACLs).
$adapter = $fs->getAdapter();
var_dump($adapter->getMetadata()); // Debug connection issues
# config/packages/monolog.yaml
handlers:
gaufrette:
type: stream
path: '%kernel.logs_dir%/gaufrette.log'
level: debug
Custom Adapters
Extend Gaufrette\Adapter\AbstractAdapter and register via config:
adapters:
custom:
custom_adapter: ~ # Reference your service
Filesystem Events
Subscribe to Knp\Bundle\GaufretteBundle\Event\FilesystemEvent:
// src/EventListener/FileUploadListener.php
public function onPreWrite(PreWriteEvent $event) {
$event->setContent(gzcompress($event->getContent()));
}
Symfony Messenger
Dispatch Gaufrette\File\File objects as messages for async processing:
$this->messageBus->dispatch(new HandleUpload($fs->get('file.txt')));
FilesystemInterface for Testing:
Mock Gaufrette\Filesystem in tests with Gaufrette\FilesystemMap.Directory Objects:
$dir = $fs->getDirectory('subfolder');
$dir->create('new_file.txt');
oneup/uploader-bundle for drag-and-drop uploads.How can I help you explore Laravel packages today?