Weave Code
Code Weaver
Helps Laravel developers discover, compare, and choose open-source packages. See popularity, security, maintainers, and scores at a glance to make better decisions.
Feedback
Share your thoughts, report bugs, or suggest improvements.
Subject
Message

Sonata Media Fixed Dimensions Resizer Laravel Package

aivus/sonata-media-fixed-dimensions-resizer

View on GitHub
Deep Wiki
Context7

Getting Started

Minimal Setup

  1. Installation:

    composer require aivus/sonata-media-fixed-dimensions-resizer
    

    Ensure sonata-project/media-bundle is installed and configured in your Laravel project.

  2. Register the Bundle: Add to config/app.php under providers:

    Aivus\Sonata\MediaBundle\SonataMediaFixedDimensionsResizerBundle::class,
    
  3. 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
    
  4. 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., 726x380120x63 for inset).


Implementation Patterns

Workflows

  1. 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
    
    • Inset: Crops the image to fit dimensions while preserving aspect ratio (centered).
    • Outbound: Scales the image to fill dimensions, potentially stretching (use sparingly).
  2. 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'
    ]);
    
  3. 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'
            ]);
    }
    

Pro Tips

  • Cache Awareness: Clear the Symfony cache (php bin/console cache:clear) after adding new formats.
  • Fallback Resizers: Combine with default Sonata resizers for backward compatibility:
    resizer: sonata.media.resizer.simple  # Fallback if fixed resizer fails
    

Gotchas and Tips

Pitfalls

  1. Deprecation Risk:

    • The package is archived (last release: 2018) and lacks Symfony 5+/Laravel 8+ compatibility. Test thoroughly or fork for updates.
    • Workaround: Use sonata-project/media-bundle v5+ with a custom resizer service (see below).
  2. Aspect Ratio Misalignment:

    • Inset may crop unintended content if the source image’s aspect ratio differs significantly from the target (e.g., portrait → landscape).
    • Debug: Use dd($media->getProvider()->getMetadata()) to inspect original dimensions.
  3. Configuration Overrides:

    • YAML config takes precedence over PHP overrides. Validate with:
      php bin/console debug:config sonata_media
      

Debugging

  • 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();
    

Extension Points

  1. 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 }
    
  2. 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']);
        }
    }
    
  3. 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 }
    
Weaver

How can I help you explore Laravel packages today?

Conversation history is not saved when not logged in.
Prompt
Add packages to context
No packages found.
jayeshmepani/jpl-moshier-ephemeris-php
elnasnato/laraliveui
labrodev/rest-sdk
sampaui/sampaui
babelqueue/php-sdk
facebook/capi-param-builder-php
babelqueue/symfony
hamzi/corewatch
minionfactory/raw-hydrator
hexters/coinpayment
rjcodes/rjcms
act-training/laravel-permissions-manager
alimarchal/laravel-chart-of-accounts
babenkoivan/elastic-scout-driver
mkwebdesign/filament-watchdog-v5
renatomarinho/laravel-page-speed
zedmagdy/filament-business-hours
renatovdemoura/blade-elements-ui
devgeek/beacon-admin
benjamin-rqt/data-watcher-bundle