Installation:
composer require joshembling/image-optimizer
Publish the config (if needed):
php artisan vendor:publish --provider="Joshembling\ImageOptimizer\ImageOptimizerServiceProvider"
First Use Case:
Replace FileUpload with OptimizedFileUpload in your Filament form:
use Joshembling\ImageOptimizer\Forms\Components\OptimizedFileUpload;
OptimizedFileUpload::make('image')
->image()
->imageEditor()
->required();
Key Files to Review:
config/image-optimizer.php (optimization settings)Joshembling\ImageOptimizer\Forms\Components\OptimizedFileUpload (core component)Form Integration:
Replace FileUpload with OptimizedFileUpload for automatic optimization during upload.
OptimizedFileUpload::make('avatar')
->image()
->directory('avatars')
->maxSize(2048);
Spatie Media Library Integration:
Use OptimizedMediaLibraryFileUpload for Spatie Media Library:
OptimizedMediaLibraryFileUpload::make('gallery')
->collection('images')
->maxSize(5)
->image();
Custom Optimization: Override default settings via config or component methods:
OptimizedFileUpload::make('hero_image')
->image()
->quality(80)
->width(1200)
->height(800);
Batch Processing: Optimize existing files post-install:
use Joshembling\ImageOptimizer\Facades\ImageOptimizer;
ImageOptimizer::optimizeDirectory(storage_path('app/public/old-images'));
OptimizedFileUpload::make('document')
->image()
->onlyWhen(fn ($record) => $record->is_premium_user);
OptimizedFileUpload::make('profile_picture')
->directory(fn ($record) => "users/{$record->id}");
OptimizedFileUpload::make('fallback_image')
->image()
->fallbackToOriginal(); // Disables optimization for this field
Filament v4 Incompatibility:
spatie/laravel-image-optimizer.Performance Overhead:
--queue option for async processing:
OptimizedFileUpload::make('large_image')->queueOptimization();
Spatie Media Library Conflicts:
SpatieMediaLibraryFileUpload, ensure OptimizedMediaLibraryFileUpload is used instead to avoid duplicate processing.FileUpload components and replace with OptimizedMediaLibraryFileUpload.Config Overrides:
config/image-optimizer.php) may override component-specific settings.->mergeConfigWith() to customize per-component:
OptimizedFileUpload::make('custom')
->mergeConfigWith(['quality' => 75, 'width' => 1000]);
'debug' => env('IMAGE_OPTIMIZER_DEBUG', false),
storage/app/temp/. Verify files exist here if uploads fail silently.ImageOptimizer::extend('webp', function ($path) {
// Custom WebP conversion logic
});
event(new OptimizingImage($originalPath, $optimizedPath));
Register listeners in EventServiceProvider:
protected $listen = [
'Joshembling\ImageOptimizer\Events\OptimizingImage' => [
YourOptimizationListener::class,
],
];
OptimizedFileUpload::make('unsupported')
->fallbackToOriginal()
->onUnsupportedFormat(function ($file) {
// Handle unsupported formats (e.g., return a placeholder)
});
How can I help you explore Laravel packages today?