slimani/filament-media-manager
Filament Media Manager for Filament v4/v5: folder-based media library with smooth browser UI, hierarchical tree navigation, tagging, search/filtering, and multi-disk support. Integrates with Filament forms, tables, and actions.
Installation:
composer require slimani/filament-media-manager
php artisan vendor:publish --tag="media-manager-migrations"
php artisan vendor:publish --provider="Spatie\MediaLibrary\MediaLibraryServiceProvider" --tag="medialibrary-migrations"
php artisan migrate
php artisan vendor:publish --tag="media-manager-config"
Register Plugin:
Add to your PanelProvider:
public function panel(Panel $panel): Panel {
return $panel->plugin(MediaManagerPlugin::make());
}
First Use Case:
InteractsWithMediaFiles trait.MediaPicker field to a Filament form:
MediaPicker::make('avatar_id')
->relationship('avatar')
->label('User Avatar')
Model Integration:
InteractsWithMediaFiles for single/multiple file relationships.avatar(), documents()).public function avatar(): BelongsTo {
return $this->mediaFile('avatar_id');
}
Form Integration:
MediaPicker::make('avatar_id')
->relationship('avatar')
MediaPicker::make('documents')
->relationship('documents')
->multiple()
Table/Infolist Display:
MediaColumn for tables:
MediaColumn::make('avatar')
->circular()
->stacked()
MediaImageEntry/MediaFileEntry for infolists:
MediaImageEntry::make('avatar')
->circular()
->conversion('thumb')
Rich Text Integration:
setUpRichContent():
$this->registerRichContent('resume')
->plugins([
MediaManagerRichContentPlugin::make()
->collection('preview')
->directory('User/Resumes'),
]);
RichEditor::make('resume')
->plugins([
MediaManagerRichContentPlugin::make(),
])
Folder/Tag Management:
MediaPicker::make('avatar_id')
->directory('User/Avatars')
->tags(['profile'])
config/media-manager.php or per-field:
MediaPicker::make('avatar_id')
->disk('s3')
AppServiceProvider:
File::registerMediaConversionsUsing(function (File $file) {
$file->addMediaConversion('custom')
->width(1000)
->height(1000);
});
MediaManagerPlugin::make()
->shouldRegisterNavigation(fn () => auth()->user()->can('manage-media'))
Missing Migrations:
php artisan migrate after publishing migrations will break file relationships.Incorrect Relationships:
MediaPicker without defining the relationship in the model throws errors.mediaFile() or mediaFiles() methods match the field name.FFMPEG for Videos:
php-ffmpeg/php-ffmpeg and server-side FFMPEG/FFProbe.Tailwind Styling:
@import and @source directives for styles/utility classes.theme.css as per the README.Signed URLs:
renderRichContent() in infolists to regenerate URLs dynamically:
TextEntry::make('resume')
->html()
->state(fn ($record) => $record->renderRichContent('resume'))
config/filesystems.php) and permissions.media_files table has entries for uploaded files.InteractsWithMediaFiles and relationships are correctly defined.php artisan filament:cache:clear).Table builder:
MediaManagerPlugin::make()
->tableActions([
Action::make('customAction')
->action(fn (File $record) => /* logic */),
]);
php artisan vendor:publish --tag="media-manager-views"
MediaWasAdded) for custom logic:
Event::listen(MediaWasAdded::class, function (MediaWasAdded $event) {
// Custom logic on upload
});
ApiResource::make(File::class, 'api/files')
->navigationIcon('heroicon-o-photo')
->navigationGroup('Media');
MediaManagerPlugin::make()
->tableActions([
Tables\Actions\DeleteBulkAction::make(),
Tables\Actions\ForceDeleteBulkAction::make(),
]);
MediaColumn::make('avatar')
->lazy()
MediaPicker::make('avatar_id')
->label(__('filament-media-manager::media.avatar'))
How can I help you explore Laravel packages today?