Media Library Development
Overview
Use spatie/laravel-medialibrary to associate files with Eloquent models. Supports image/video conversions, responsive images, multiple collections, and various storage disks.
When to Activate
- Activate when working with file uploads, media attachments, or image processing in Laravel.
- Activate when code references
HasMedia,InteractsWithMedia, theMediamodel, or media collections/conversions. - Activate when the user wants to add, retrieve, convert, or manage files attached to Eloquent models.
Scope
- In scope: media uploads, collections, conversions, responsive images, custom properties, file retrieval, path/URL generation.
- Out of scope: general file storage without Eloquent association, non-Laravel frameworks.
Workflow
- Identify the task (model setup, adding media, defining conversions, retrieving files, etc.).
- Read
references/medialibrary-guide.mdand focus on the relevant section. - Apply the patterns from the reference, keeping code minimal and Laravel-native.
Core Concepts
Model Setup
Every model that should have media must implement HasMedia and use the InteractsWithMedia trait:
phpuse Spatie\MediaLibrary\HasMedia; use Spatie\MediaLibrary\InteractsWithMedia; class BlogPost extends Model implements HasMedia { use InteractsWithMedia; }
Adding Media
php$blogPost->addMedia($file)->toMediaCollection('images'); $blogPost->addMediaFromUrl($url)->toMediaCollection('images'); $blogPost->addMediaFromRequest('file')->toMediaCollection('images');
Defining Collections
phppublic function registerMediaCollections(): void { $this->addMediaCollection('avatar')->singleFile(); $this->addMediaCollection('downloads')->useDisk('s3'); }
Defining Conversions
phpuse Spatie\MediaLibrary\MediaCollections\Models\Media; use Spatie\Image\Enums\Fit; public function registerMediaConversions(?Media $media = null): void { $this->addMediaConversion('thumb') ->fit(Fit::Contain, 300, 300) ->nonQueued(); }
Retrieving Media
php$url = $model->getFirstMediaUrl('images'); $thumbUrl = $model->getFirstMediaUrl('images', 'thumb'); $allMedia = $model->getMedia('images');
Do and Don't
Do:
- Always implement the
HasMediainterface alongside theInteractsWithMediatrait. - Use
?Media $media = nullas the parameter forregisterMediaConversions(). - Call
->toMediaCollection()to finalize adding media. - Use
->nonQueued()for conversions that should run synchronously. - Use
->singleFile()on collections that should only hold one file. - Use
Spatie\Image\Enums\Fitenum values for fit methods.
Don't:
- Don't forget to run
php artisan vendor:publish --provider="Spatie\MediaLibrary\MediaLibraryServiceProvider" --tag="medialibrary-migrations"before migrating. - Don't use
env()for disk configuration; useconfig()or set it inconfig/media-library.php. - Don't call
addMedia()without callingtoMediaCollection()— the media won't be saved. - Don't reference conversion names that aren't registered in
registerMediaConversions().
References
references/medialibrary-guide.md


