PHP code example of lisowiecw / filament-media-library

1. Go to this page and download the library: Download lisowiecw/filament-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/ */

    

lisowiecw / filament-media-library example snippets


use Lisowiecw\MediaLibrary\MediaLibraryPlugin;

public function panel(Panel $panel): Panel
{
    return $panel
        ->plugin(MediaLibraryPlugin::make());
}

use Lisowiecw\MediaLibrary\Concerns\HasMedia;

class Article extends Model
{
    use HasMedia;
}

use Lisowiecw\MediaLibrary\Forms\Components\MediaPicker;

MediaPicker::make('cover_image')
    ->visibility('public')
    ->acceptedFileTypes(['image/*']);

MediaPicker::make('gallery')
    ->visibility('public')
    ->multiple()
    ->reorderable()
    ->droppable();

$article->firstMedia('cover_image')?->url();

foreach ($article->media('gallery') as $asset) {
    echo $asset->url();
}

$products = Product::query()->withMedia('thumbnail')->get();

$products->loadMedia('thumbnail', 'gallery'); // hosts already in memory
$product->loadMedia('thumbnail');             // one host

use Illuminate\Support\Facades\Gate;
use Lisowiecw\MediaLibrary\Models\MediaAsset;

Gate::policy(MediaAsset::class, App\Policies\MediaAssetPolicy::class);

Gate::define('uploadMedia', fn (User $user, Model|string|null $host, ?string $field) => $user->isEditor());
Gate::define('attachMedia', fn (User $user, Model|string|null $host, ?string $field) => $user->isEditor());

// config/filesystems.php
'r2-public' => [
    'driver' => 's3',
    // ... key, secret, region, bucket, endpoint
    'url' => env('R2_PUBLIC_URL'),  // the public hostname bound to this bucket
],

'r2-private' => [
    'driver' => 's3',
    // ... key, secret, region, bucket, endpoint
    // no `url`: nothing about this bucket is publicly addressable
],

MediaPicker::make('gallery')->visibility('public');   // r2-public
MediaPicker::make('contracts')->visibility('private'); // r2-private

use Lisowiecw\MediaLibrary\Models\MediaAsset;

MediaLibraryPlugin::make()
    ->downloadFilenameUsing(fn (MediaAsset $asset): string => $asset->display_name);

Route::get('/orders/{order}/download/{token}', function (Order $order, string $token) {
    abort_unless($order->downloadTokenIsValid($token), 403);
    abort_if($order->downloads_remaining < 1, 410);

    $asset = $order->product->pdf;   // a MediaAsset, however your app reaches it

    $order->decrement('downloads_remaining');

    return Storage::disk($asset->disk)->download(
        $asset->object_key,
        DownloadFilename::for($asset),
    );
})->name('orders.download');

return redirect()->away(Storage::disk($asset->disk)->temporaryUrl(
    $asset->object_key,
    now()->addMinutes(5),
));

public function view(?User $user, MediaAsset $asset): bool
{
    return $user !== null && Order::forUser($user)->hasUnspentDownloadOf($asset);
}

$article->detachMedia('cover_image', $asset);

use Lisowiecw\MediaLibrary\Exceptions\DeleteBlocked;
use Lisowiecw\MediaLibrary\Lifecycle\AssetLifecycle;

try {
    app(AssetLifecycle::class)->delete($asset);
} catch (DeleteBlocked $blocked) {
    // $blocked->usage is the list to review, then:
    app(AssetLifecycle::class)->delete($asset, force: true);
}

$asset->attachments()->createExternal('newsletter-2026-08', 'Campaign #412');

$asset->attachments()->revokeExternal('newsletter-2026-08');

use Filament\Forms\Components\RichEditor;
use Illuminate\Http\UploadedFile;
use Lisowiecw\MediaLibrary\Enums\Visibility;
use Lisowiecw\MediaLibrary\Ingest\IngestService;
use Lisowiecw\MediaLibrary\Ingest\Placement;
use Lisowiecw\MediaLibrary\Models\MediaAsset;

function editorReference(MediaAsset $asset): string
{
    return 'editor:'.$asset->ulid;
}

RichEditor::make('body')
    ->saveUploadedFileAttachmentsUsing(function (UploadedFile $file): string {
        $asset = app(IngestService::class)->ingest($file, Placement::resolve(
            directory: 'editor',
            visibility: Visibility::Public,
        ));

        $asset->attachments()->createExternal(editorReference($asset), 'Post body');

        return $asset->url();
    });

$asset->attachments()->revokeExternal(editorReference($asset));

->plugin(MediaLibraryPlugin::make()->withLibraryManagement())

->plugin(MediaLibraryPlugin::make()->tenantUsing(fn () => Filament::getTenant()))
bash
php artisan vendor:publish --tag="media-library-config"
bash
php artisan vendor:publish --tag="media-library-migrations"
php artisan migrate
bash
php artisan vendor:publish --tag="media-library-views"
bash
php artisan vendor:publish --tag="media-library-translations"
bash
php artisan media:regenerate-derivatives --hashes --dry-run
php artisan media:regenerate-derivatives --hashes
bash
php artisan media:unattached-assets
php artisan media:unattached-assets --days=90