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, the Media model, 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.md and 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:
use Spatie\MediaLibrary\HasMedia;
use Spatie\MediaLibrary\InteractsWithMedia;
class BlogPost extends Model implements HasMedia
{
use InteractsWithMedia;
}
Adding Media
$blogPost->addMedia($file)->toMediaCollection('images');
$blogPost->addMediaFromUrl($url)->toMediaCollection('images');
$blogPost->addMediaFromRequest('file')->toMediaCollection('images');
Defining Collections
public function registerMediaCollections(): void
{
$this->addMediaCollection('avatar')->singleFile();
$this->addMediaCollection('downloads')->useDisk('s3');
}
Defining Conversions
use 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
$url = $model->getFirstMediaUrl('images');
$thumbUrl = $model->getFirstMediaUrl('images', 'thumb');
$allMedia = $model->getMedia('images');
Do and Don't
Do:
- Always implement the
HasMedia interface alongside the InteractsWithMedia trait.
- Use
?Media $media = null as the parameter for registerMediaConversions().
- 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\Fit enum 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; use config() or set it in config/media-library.php.
- Don't call
addMedia() without calling toMediaCollection() — the media won't be saved.
- Don't reference conversion names that aren't registered in
registerMediaConversions().
References
references/medialibrary-guide.md
1---2name: medialibrary-development3description: Build and work with spatie/laravel-medialibrary features including associating files with Eloquent models, defining media collections and conversions, generating responsive images, and retrieving media URLs and paths.4license: MIT5---67# Media Library Development89## Overview10Use spatie/laravel-medialibrary to associate files with Eloquent models. Supports image/video conversions, responsive images, multiple collections, and various storage disks.1112## When to Activate13- Activate when working with file uploads, media attachments, or image processing in Laravel.14- Activate when code references `HasMedia`, `InteractsWithMedia`, the `Media` model, or media collections/conversions.15- Activate when the user wants to add, retrieve, convert, or manage files attached to Eloquent models.1617## Scope18- In scope: media uploads, collections, conversions, responsive images, custom properties, file retrieval, path/URL generation.19- Out of scope: general file storage without Eloquent association, non-Laravel frameworks.2021## Workflow221. Identify the task (model setup, adding media, defining conversions, retrieving files, etc.).232. Read `references/medialibrary-guide.md` and focus on the relevant section.243. Apply the patterns from the reference, keeping code minimal and Laravel-native.2526## Core Concepts2728### Model Setup29Every model that should have media must implement `HasMedia` and use the `InteractsWithMedia` trait:3031```php32use Spatie\MediaLibrary\HasMedia;33use Spatie\MediaLibrary\InteractsWithMedia;3435class BlogPost extends Model implements HasMedia36{37 use InteractsWithMedia;38}39```4041### Adding Media42```php43$blogPost->addMedia($file)->toMediaCollection('images');44$blogPost->addMediaFromUrl($url)->toMediaCollection('images');45$blogPost->addMediaFromRequest('file')->toMediaCollection('images');46```4748### Defining Collections49```php50public function registerMediaCollections(): void51{52 $this->addMediaCollection('avatar')->singleFile();53 $this->addMediaCollection('downloads')->useDisk('s3');54}55```5657### Defining Conversions58```php59use Spatie\MediaLibrary\MediaCollections\Models\Media;60use Spatie\Image\Enums\Fit;6162public function registerMediaConversions(?Media $media = null): void63{64 $this->addMediaConversion('thumb')65 ->fit(Fit::Contain, 300, 300)66 ->nonQueued();67}68```6970### Retrieving Media71```php72$url = $model->getFirstMediaUrl('images');73$thumbUrl = $model->getFirstMediaUrl('images', 'thumb');74$allMedia = $model->getMedia('images');75```7677## Do and Don't7879Do:80- Always implement the `HasMedia` interface alongside the `InteractsWithMedia` trait.81- Use `?Media $media = null` as the parameter for `registerMediaConversions()`.82- Call `->toMediaCollection()` to finalize adding media.83- Use `->nonQueued()` for conversions that should run synchronously.84- Use `->singleFile()` on collections that should only hold one file.85- Use `Spatie\Image\Enums\Fit` enum values for fit methods.8687Don't:88- Don't forget to run `php artisan vendor:publish --provider="Spatie\MediaLibrary\MediaLibraryServiceProvider" --tag="medialibrary-migrations"` before migrating.89- Don't use `env()` for disk configuration; use `config()` or set it in `config/media-library.php`.90- Don't call `addMedia()` without calling `toMediaCollection()` — the media won't be saved.91- Don't reference conversion names that aren't registered in `registerMediaConversions()`.9293## References94- `references/medialibrary-guide.md`