Installation
composer require sonata-project/media-bundle
Add to config/bundles.php (Symfony):
return [
// ...
Sonata\MediaBundle\SonataMediaBundle::class => ['all' => true],
];
Database & Fixtures Run migrations:
php bin/console doctrine:migrations:diff
php bin/console doctrine:migrations:migrate
Load default media providers (e.g., sonata.media.provider.image):
php bin/console sonata:easy-extends:generate SonataMediaBundle
First Use Case: Uploading an Image
SonataMediaType:
use Sonata\MediaBundle\Form\Type\MediaType;
$builder->add('image', MediaType::class, [
'provider' => 'sonata.media.provider.image',
]);
/admin/media) or programmatically:
$mediaManager = $this->get('sonata.media.manager.media');
$media = $mediaManager->create();
$media->setProviderValue('image', $file); // $file is an UploadedFile
$mediaManager->save($media);
Media Management
/admin/media) for manual uploads.Media model:
$post->setMedia([$media]); // Assuming $post has a `media` relation
$entityManager->persist($post);
$entityManager->flush();
Custom Providers
Sonata\MediaBundle\Model\MediaProviderInterface for new formats (e.g., PDFs, videos):
class CustomProvider extends AbstractProvider
{
public function generatePublicUrl($directory, $name)
{
return "/uploads/custom/{$name}";
}
}
config/packages/sonata_media.yaml:
sonata_media:
providers:
sonata.media.provider.custom:
class: App\Provider\CustomProvider
Thumbnails & Transformations
sonata.media.thumbnail.format to generate thumbnails:
$thumbnail = $media->getThumbnail('small');
config/packages/sonata_media.yaml:
sonata_media:
formats:
small: { width: 100, quality: 90 }
Integration with Entities
ManyToOne/ManyToMany relations to entities:
/**
* @ORM\ManyToOne(targetEntity="Sonata\MediaBundle\Entity\Media", inversedBy="posts")
*/
private $featuredImage;
MediaType in forms to auto-populate relations.API Exposure
sonata.media.api.read:
$serializer = $this->get('serializer');
$mediaData = $serializer->serialize($media, 'json', ['groups' => ['media']]);
Provider Configuration
sonata_media.yaml will break uploads.providers section includes all custom providers.File Permissions
chmod -R 775 var/media).Thumbnail Generation
imagick/gd PHP extensions are missing.sudo apt-get install php-imagick) and restart PHP.Caching Issues
php bin/console cache:clear
Entity Relations
inversedBy) must match exactly (case-sensitive).make:entity to generate correct relations.var/log/dev.log for SonataMediaBundle errors.php bin/console sonata:media:debug to list available providers.php bin/console sonata:media:clear-cache if thumbnails appear broken.Custom Media Models
Sonata\MediaBundle\Entity\Media to add fields (e.g., altText):
class CustomMedia extends Media
{
/**
* @ORM\Column(type="string", nullable=true)
*/
private $altText;
}
sonata_media.yaml to use the new class.Event Listeners
sonata.media.post_persist to auto-tag media:
$event->getSubject()->setContext(['tags' => ['uploaded']]);
Custom Admin
sonata_admin:
options:
group: 'Media'
label: 'Custom Media'
label_catalogue: 'sonata_media'
class: App\Entity\CustomMedia
How can I help you explore Laravel packages today?