aivus/sonata-media-fixed-dimensions-resizer
Installation:
composer require aivus/sonata-media-fixed-dimensions-resizer
Ensure sonata-project/media-bundle is installed and configured in your Laravel project.
Register the Bundle:
Add to config/app.php under providers:
Aivus\Sonata\MediaBundle\SonataMediaFixedDimensionsResizerBundle::class,
Configure Formats:
Extend your sonata_media config (typically in config/packages/sonata_media.php) to include the new resizers:
formats:
thumbnail:
width: 120
height: 120
quality: 90
resizer: aivus.sonata.media.resizer.fixedDimensions.inset
First Use Case:
Upload an image via SonataMedia admin or API. The resizer will automatically generate a thumbnail maintaining the fixed aspect ratio (e.g., 726x380 → 120x63 for inset).
Dynamic Format Generation:
Use the resizer in custom media formats (e.g., social_share, product_grid):
formats:
social_share:
width: 600
height: 300
resizer: aivus.sonata.media.resizer.fixedDimensions.outbound
Conditional Resizing:
Override resizers per media type in your MediaManager:
$media->setFormat('thumbnail', [
'width' => 200,
'height' => 200,
'resizer' => $media->getContext() === 'admin' ?
'aivus.sonata.media.resizer.fixedDimensions.inset' :
'sonata.media.resizer.simple'
]);
Integration with Sonata Admin:
Extend the MediaAdmin class to enforce resizers for specific fields:
protected function configureListFields(ListMapper $listMapper) {
$listMapper
->add('thumbnail', 'sonata_type_model_list', [
'format' => 'thumbnail',
'resizer' => 'aivus.sonata.media.resizer.fixedDimensions.inset'
]);
}
php bin/console cache:clear) after adding new formats.resizer: sonata.media.resizer.simple # Fallback if fixed resizer fails
Deprecation Risk:
sonata-project/media-bundle v5+ with a custom resizer service (see below).Aspect Ratio Misalignment:
dd($media->getProvider()->getMetadata()) to inspect original dimensions.Configuration Overrides:
php bin/console debug:config sonata_media
Log Resizer Output:
Add a temporary logger in app/Providers/AppServiceProvider.php:
public function boot() {
\Monolog\Logger::addLogger(new \Monolog\Handler\StreamHandler(storage_path('logs/resizer.log')));
}
Then trace resizer calls via Monolog.
Manual Resizing Test: Trigger resizing programmatically:
$media = $this->get('sonata.media.manager.media')->find(1);
$media->generateTransformedTemplate('thumbnail');
$media->save();
Custom Resizer Service: Create a service to extend functionality (e.g., add padding):
# config/services.yaml
services:
App\Service\CustomFixedResizer:
arguments:
- '@sonata.media.resizer.data_converter'
- '@sonata.media.resizer.abstract_resizer'
tags:
- { name: sonata.media.resizer, type: custom_fixed, priority: 100 }
Event Listeners:
Hook into sonata.media.generate_transformed_template to validate dimensions:
public function onGenerateTransformedTemplate(MediaGenerateTransformedTemplateEvent $event) {
$format = $event->getFormat();
if ($format['resizer'] === 'aivus.sonata.media.resizer.fixedDimensions.*') {
$this->validateAspectRatio($format['width'], $format['height']);
}
}
Fallback Mechanism:
Implement a hybrid resizer in app/Resizer/FixedFallbackResizer.php:
use Sonata\MediaBundle\Resizer\ResizerInterface;
class FixedFallbackResizer implements ResizerInterface {
private $insetResizer;
private $simpleResizer;
public function __construct($insetResizer, $simpleResizer) {
$this->insetResizer = $insetResizer;
$this->simpleResizer = $simpleResizer;
}
public function resize($sourcePath, $targetPath, $format) {
try {
return $this->insetResizer->resize($sourcePath, $targetPath, $format);
} catch (\Exception $e) {
return $this->simpleResizer->resize($sourcePath, $targetPath, $format);
}
}
}
Register it in services.yaml:
services:
App\Resizer\FixedFallbackResizer:
arguments:
- '@aivus.sonata.media.resizer.fixedDimensions.inset'
- '@sonata.media.resizer.simple'
tags:
- { name: sonata.media.resizer, type: fixed_fallback }
How can I help you explore Laravel packages today?