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
Source: MineTrax/minetrax — distributed by TomeVault.
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. Use when this capability is needed.4---56# Media Library Development78## Overview910Use spatie/laravel-medialibrary to associate files with Eloquent models. Supports image/video conversions, responsive images, multiple collections, and various storage disks.1112## When to Activate1314- Activate when working with file uploads, media attachments, or image processing in Laravel.15- Activate when code references `HasMedia`, `InteractsWithMedia`, the `Media` model, or media collections/conversions.16- Activate when the user wants to add, retrieve, convert, or manage files attached to Eloquent models.1718## Scope1920- In scope: media uploads, collections, conversions, responsive images, custom properties, file retrieval, path/URL generation.21- Out of scope: general file storage without Eloquent association, non-Laravel frameworks.2223## Workflow24251. Identify the task (model setup, adding media, defining conversions, retrieving files, etc.).262. Read `references/medialibrary-guide.md` and focus on the relevant section.273. Apply the patterns from the reference, keeping code minimal and Laravel-native.2829## Core Concepts3031### Model Setup3233Every model that should have media must implement `HasMedia` and use the `InteractsWithMedia` trait:3435```php36use Spatie\MediaLibrary\HasMedia;37use Spatie\MediaLibrary\InteractsWithMedia;3839class BlogPost extends Model implements HasMedia40{41 use InteractsWithMedia;42}43```4445### Adding Media4647```php48$blogPost->addMedia($file)->toMediaCollection('images');49$blogPost->addMediaFromUrl($url)->toMediaCollection('images');50$blogPost->addMediaFromRequest('file')->toMediaCollection('images');51```5253### Defining Collections5455```php56public function registerMediaCollections(): void57{58 $this->addMediaCollection('avatar')->singleFile();59 $this->addMediaCollection('downloads')->useDisk('s3');60}61```6263### Defining Conversions6465```php66use Spatie\MediaLibrary\MediaCollections\Models\Media;67use Spatie\Image\Enums\Fit;6869public function registerMediaConversions(?Media $media = null): void70{71 $this->addMediaConversion('thumb')72 ->fit(Fit::Contain, 300, 300)73 ->nonQueued();74}75```7677### Retrieving Media7879```php80$url = $model->getFirstMediaUrl('images');81$thumbUrl = $model->getFirstMediaUrl('images', 'thumb');82$allMedia = $model->getMedia('images');83```8485## Do and Don't8687Do:88- Always implement the `HasMedia` interface alongside the `InteractsWithMedia` trait.89- Use `?Media $media = null` as the parameter for `registerMediaConversions()`.90- Call `->toMediaCollection()` to finalize adding media.91- Use `->nonQueued()` for conversions that should run synchronously.92- Use `->singleFile()` on collections that should only hold one file.93- Use `Spatie\Image\Enums\Fit` enum values for fit methods.9495Don't:96- Don't forget to run `php artisan vendor:publish --provider="Spatie\MediaLibrary\MediaLibraryServiceProvider" --tag="medialibrary-migrations"` before migrating.97- Don't use `env()` for disk configuration; use `config()` or set it in `config/media-library.php`.98- Don't call `addMedia()` without calling `toMediaCollection()` — the media won't be saved.99- Don't reference conversion names that aren't registered in `registerMediaConversions()`.100101## References102103- `references/medialibrary-guide.md`104105---106> Source: [MineTrax/minetrax](https://github.com/MineTrax/minetrax) — distributed by [TomeVault](https://tomevault.io).107<!-- tomevault:4.0:skill_md:2026-06-19 -->