A media collection can be more than just a name to group files. By defining a media collection in your model you can add certain behaviour collections.
To get started with media collections add a function called registerMediaCollections to your prepared model. Inside that function you can use addMediaCollection to start a media collection.
// in your modelpublicfunctionregisterMediaCollections(): void
{
$this->addMediaCollection('my-collection')
//add options
...
// you can define as many collections as needed$this->addMediaCollection('my-other-collection')
//add options
...
}
If your media collection does not contain any items, calling getFirstMediaUrl or getFirstMediaPath will return null. You can change this by setting a fallback url and/or path using useFallbackUrl and useFallbackPath.
You can defined an array of accepted Mime types using acceptsMimeTypes that will check if a file with a certain Mime type is allowed into the collection. In this example we only accept image/jpeg files.
If you want a collection to hold only one file you can use singleFile on the collection. A good use case for this would be an avatar collection on a User model. In most cases you'd want to have a user to only have one avatar.
// in your modelpublicfunctionregisterMediaCollections(): void
{
$this
->addMediaCollection('avatar')
->singleFile();
}
The first time you add a file to the collection it will be stored as usual.
$yourModel->addMedia($pathToImage)->toMediaCollection('avatar');
$yourModel->getMedia('avatar')->count(); // returns 1$yourModel->getFirstMediaUrl('avatar'); // will return an url to the `$pathToImage` file
When adding another file to a single file collection the first one will be deleted.
// this will remove other files in the collection$yourModel->addMedia($anotherPathToImage)->toMediaCollection('avatar');
$yourModel->getMedia('avatar')->count(); // returns 1$yourModel->getFirstMediaUrl('avatar'); // will return an url to the `$anotherPathToImage` file
This video shows you a demo of a single file collection.
Whenever you want to limit the amount of files inside a collection you can use the onlyKeepLatest(n) method. Whenever you add a file to a collection and exceed the given limit, MediaLibrary will delete the oldest file(s) and keep the collection size at n.
// in your modelpublicfunctionregisterMediaCollections(): void
{
$this
->addMediaCollection('limited-collection')
->onlyKeepLatest(3);
}
For the first 3 files, nothing strange happens. The files get added to the collection and the collection now holds all 3 files. Whenever you decide to add a 4th file, MediaLibrary deletes the first file and keeps the latest 3.
$yourModel->addMedia($firstFile)->toMediaCollection('limited-collection');
$yourModel->getMedia('avatar')->count(); // returns 1$yourModel->addMedia($secondFile)->toMediaCollection('limited-collection');
$yourModel->getMedia('avatar')->count(); // returns 2$yourModel->addMedia($thirdFile)->toMediaCollection('limited-collection');
$yourModel->getMedia('avatar')->count(); // returns 3$yourModel->addMedia($fourthFile)->toMediaCollection('limited-collection');
$yourModel->getMedia('avatar')->count(); // returns 3$yourModel->getFirstMediaUrl('avatar'); // will return an url to the `$secondFile` file
It's recommended that your first read the section on converting images before reading the following paragraphs.
Normally image conversions are registered inside the registerMediaConversions function on your model. However, images conversions can also be registered inside media collections.
When adding an image to my-collection a thumbnail that fits inside 100x100 will be created.
$yourModel->addMedia($pathToImage)->toMediaCollection('my-collection');
$yourModel->getFirstMediaUrl('my-collection', 'thumb') // returns an url to a 100x100 version of the added image.
Take a look at the defining conversions section to learn all the functions you can tack on to addMediaConversion.
If you want to also generate responsive images for any media added to a collection you defined, you can simply use withResponsiveImages while defining it.
// in your modelpublicfunctionregisterMediaCollections(): void
{
$this
->addMediaCollection('my-collection')
->withResponsiveImages();
}