PHP code example of sandeep816 / smart-media-library

1. Go to this page and download the library: Download sandeep816/smart-media-library library. Choose the download type require.

2. Extract the ZIP file and open the index.php.

3. Add this code to the index.php.
    
        
<?php
require_once('vendor/autoload.php');

/* Start to develop here. Best regards https://php-download.com/ */

    

sandeep816 / smart-media-library example snippets


use FilamentMediaLibrary\MediaLibraryPlugin;

public function panel(Panel $panel): Panel
{
    return $panel
        ->default()
        ->id('admin')
        ->path('admin')
        ->plugins([
            MediaLibraryPlugin::make(),
        ]);
}

MediaLibraryPlugin::make()
    ->navigationLabel('Media Assets')
    ->navigationGroup('Content')
    ->navigationIcon('heroicon-o-folder-open')
    ->navigationSort(15)
    ->shouldRegisterNavigation(true)
    ->title('Digital Assets Library')
    ->subheading('Browse, search, and upload central media files.')
    ->authorizeUsing(function ($user, string $ability, ?Media $media = null): bool {
        return $user->hasRole('admin') || $user->hasRole('editor');
    });

return [
    // Storage disk to store uploads (must exist in config/filesystems.php)
    'default_disk' => env('FILAMENT_MEDIA_LIBRARY_DISK', 'public'),

    // Base storage folder path on the disk
    'default_directory' => env('FILAMENT_MEDIA_LIBRARY_DIR', 'media'),

    // Table names
    'table_name' => 'media',
    'attachments_table_name' => 'media_attachments',

    // Upload constraints
    'upload' => [
        'max_size_kb' => (int) env('FILAMENT_MEDIA_LIBRARY_MAX_SIZE_KB', 10240), // 10 MB
        'allowed_mime_types' => [
            'image/jpeg',
            'image/png',
            'image/webp',
            'image/gif',
            'image/svg+xml',
            'application/pdf',
            'video/mp4',
            'video/webm',
            'audio/mpeg',
            'audio/wav',
        ],
    ],

    // UI Pagination
    'pagination' => [
        'per_page' => 24,
    ],

    // Navigation & Page defaults
    'page_title' => 'Media Library',
    'page_subheading' => 'Manage and reuse your files from one central library.',
    'navigation_label' => 'Media Library',
    'navigation_group' => null,
    'navigation_icon' => 'heroicon-o-photo',
    'navigation_sort' => null,
    'should_register_navigation' => true,
];

MediaLibraryPlugin::make()
    ->authorizeUsing(function ($user, string $ability, ?Media $media = null): bool {
        if ($ability === 'upload') {
            return $user->can('upload_media');
        }
        return true;
    });

use FilamentMediaLibrary\Support\MediaAuthorization;

MediaAuthorization::authorizeUsing('delete', fn ($user, $media) => $user->is_super_admin);

namespace App\Policies;

use App\Models\User;
use FilamentMediaLibrary\Models\Media;

class MediaPolicy
{
    public function viewAny(User $user): bool { return true; }
    public function create(User $user): bool { return $user->can('create_media'); }
    public function update(User $user, Media $media): bool { return $user->id === $media->uploaded_by; }
    public function delete(User $user, Media $media): bool { return $user->is_admin; }
    public function restore(User $user, Media $media): bool { return $user->is_admin; }
    public function forceDelete(User $user, Media $media): bool { return $user->is_super_admin; }
    public function view(User $user, Media $media): bool { return true; }
}

Gate::define('filament-media-library.upload', fn ($user) => $user->hasVerifiedEmail());
Gate::define('filament-media-library.delete', fn ($user, $media) => $user->is_admin);

use FilamentMediaLibrary\Filament\Forms\Components\MediaPicker;

MediaPicker::make('featured_image_uuid')
    ->label('Featured Image')
    ->image();

MediaPicker::make('gallery_uuids')
    ->label('Project Gallery')
    ->multiple()
    ->reorderable()
    ->maxItems(8)
    ->image();

MediaPicker::make('hero_banner')
    ->label('Hero Banner')
    ->relationship('hero')
    ->image();

MediaPicker::make('documents')
    ->label('Case Study PDFs')
    ->relationship('case_studies')
    ->multiple()
    ->document();

// Only allow image selection
MediaPicker::make('avatar')->image();

// Only allow PDF documents
MediaPicker::make('manual')->document();

// Custom MIME types
MediaPicker::make('assets')->acceptedMediaTypes(['image/svg+xml', 'application/pdf']);

// Disable inline uploads inside the picker modal
MediaPicker::make('archive_photo')->allowUpload(false);

namespace App\Models;

use FilamentMediaLibrary\Concerns\InteractsWithMediaAttachments;
use Illuminate\Database\Eloquent\Model;

class Post extends Model
{
    use InteractsWithMediaAttachments;
}

$post = Post::find(1);

// Get single media record
$heroMedia = $post->singleMediaFor('hero');

// Get collection of media records ordered by sort order
$gallery = $post->mediaFor('gallery');

// Get array of UUIDs
$uuids = $post->mediaUuidsFor('gallery');

// Sync attachments for a collection: syncMedia(string $collection, array $mediaUuids)
$post->syncMedia('gallery', ['uuid-1', 'uuid-2']);

// Attach additional media: attachMedia(string $collection, string|array $mediaUuids)
$post->attachMedia('gallery', 'uuid-3');

// Detach specific media: detachMedia(string $collection, ?array $mediaUuids)
$post->detachMedia('gallery', ['uuid-3']);

// Detach entire collection
$post->detachMedia('gallery');

use FilamentMediaLibrary\Contracts\MediaUploader;
use FilamentMediaLibrary\Support\MediaUploadOptions;

$media = app(MediaUploader::class)->upload(
    $request->file('avatar'),
    new MediaUploadOptions(
        disk: 'public',
        directory: 'avatars',
        title: 'User Profile Picture',
        altText: 'Headshot portrait',
        uploadedBy: (string) auth()->id(),
        metadata: ['ip' => $request->ip()],
    ),
);

// Check if a conversion exists
if ($media->hasConversion('thumbnail')) {
    // Returns the URL for the conversion (or null)
    $thumbUrl = $media->conversionUrl('thumbnail');
}

// Retrieve full conversion metadata array
$medium = $media->getConversion('medium');
// [
//     'preset' => 'medium',
//     'path' => 'media/conversions/uuid-medium.webp',
//     'disk' => 'public',
//     'width' => 800,
//     'height' => 600,
//     'mime_type' => 'image/webp',
//     'size_bytes' => 45120,
//     'created_at' => 1718000000,
// ]

'conversions' => [
    'enabled' => true,
    'directory' => 'conversions',
    'presets' => [
        'thumbnail' => [
            'width' => 150,
            'height' => 150,
            'quality' => 80,
            'format' => 'webp', // 'webp', 'jpg', 'png', or null for original
        ],
        'small' => [
            'width' => 400,
            'height' => 400,
            'quality' => 85,
            'format' => 'webp',
        ],
        'medium' => [
            'width' => 800,
            'height' => 800,
            'quality' => 85,
            'format' => 'webp',
        ],
    ],
],
bash
php artisan vendor:publish --tag="filament-media-library-config"
bash
php artisan vendor:publish --tag="filament-media-library-migrations"
php artisan migrate
bash
php artisan vendor:publish --tag="filament-media-library-views"
php artisan vendor:publish --tag="filament-media-library-assets"