Installation:
composer require farhanshares/laravel-mediaman
php artisan vendor:publish --provider="FarhanShares\MediaMan\MediaManServiceProvider"
php artisan migrate
config/mediaman.php) and migrations (creates media and media_models tables).Configuration:
config/mediaman.php:
'disks' => [
'public' => 'public',
's3' => 's3',
],
uploads/{model}).First Use Case:
Post):
use FarhanShares\MediaMan\Traits\MediaMan;
class Post extends Model
{
use MediaMan;
}
$post = Post::create(['title' => 'Hello World']);
$post->addMediaFromUrl('https://example.com/image.jpg')->toMediaCollection('images');
Media Uploads:
$model->addMediaFromUrl($url)->toMediaCollection('collection_name');
$model->addMediaFromRequest('file_input')->toMediaCollection('collection_name');
$model->addMediaFromPath($localPath)->toMediaCollection('collection_name');
Media Collections:
public function registerMediaCollections(): void
{
$this->addMediaCollection('images')
->singleFile()
->useDisk('public');
$this->addMediaCollection('documents')
->multipleFiles()
->useDisk('s3');
}
validateMedia() to enforce rules (e.g., MIME types, max size):
$this->validateMedia('images', function ($attribute, $value, $fail) {
$value->mimeTypeIn(['image/jpeg', 'image/png'], $fail);
});
Media Conversion:
registerMediaConversions():
public function registerMediaConversions(Media $media = null): void
{
$this->addMediaConversion('thumb')
->width(200)
->height(200)
->sharpen(10);
}
$media = $model->getFirstMedia('images');
$model->addMedia($media)->toMediaCollection('thumbs')->usingFileName('thumb_'.$media->file_name);
Model Associations:
$posts = Post::with('images')->get();
$media = $post->getFirstMedia('images');
$url = $media->getUrl();
$path = $media->getPath();
Broadcasting:
MediaAdded):
use FarhanShares\MediaMan\Events\MediaAdded;
MediaAdded::dispatch($model, $media);
Form Handling:
laravel-mediaman's form helpers for file uploads:
<input type="file" name="images[]" multiple>
$model->addMedia($request->file('images'))->toMediaCollection('images');
API Responses:
MediaResource:
use FarhanShares\MediaMan\Http\Resources\MediaResource;
return new MediaResource($media);
Queueing Uploads:
$model->addMediaFromUrl($url)->toMediaCollection('images')->queue();
Custom Storage:
FarhanShares\MediaMan\Filesystem\MediaFilesystem for custom logic (e.g., S3 presigned URLs).Disk Configuration:
config/mediaman.php match your filesystems.php configuration.php artisan storage:link for local public disk.Media Collection Naming:
hasMediaCollection() to check existence before adding.Event Dispatching:
MediaAdded are not dispatched by default. Explicitly dispatch if needed:
$model->addMedia(...)->dispatchMediaEvents();
Conversion Caching:
php artisan mediaman:clear-cache
->keepOriginal(false) to avoid storing originals for conversions.Large Files:
$model->addMediaFromRequest('file')->queue();
Model Binding:
media_models table has model_type and model_id columns.Log Media Events:
config/mediaman.php:
'logging' => true,
storage/logs/laravel.log for media operations.Validate Media:
dd($media->errors()) to inspect validation failures.Check Disk Space:
media table growth. Archive old media if needed.Custom Validators:
FarhanShares\MediaMan\Validation\Rules\Media for custom rules.Media Events:
MediaDeleting to add cleanup logic:
MediaDeleting::subscribe(function ($media) {
// Custom logic before deletion
});
Filesystem Adapters:
FarhanShares\MediaMan\Contracts\FilesystemAdapter for custom storage backends.UI Integration:
mediaman:ui package (if available) or build custom UI with:
$media = $model->getMedia('images');
$media->map->getUrl();
Model Observers:
$model->observedBy(MediaObserver::class);
How can I help you explore Laravel packages today?