ebess/advanced-nova-media-library
Installation
composer require ebess/advanced-nova-media-library
php artisan vendor:publish --provider="EBESS\AdvancedNovaMediaLibrary\AdvancedNovaMediaLibraryServiceProvider"
php artisan nova:publish
config/advanced-nova-media-library.php) and Nova assets.Configuration
config/advanced-nova-media-library.php to define:
['images/*', 'video/*']).default_disk: 'public').media-library).spatie/laravel-media-library is installed and configured in your Laravel app.Basic Usage
use EBESS\AdvancedNovaMediaLibrary\AdvancedNovaMediaLibrary;
public static $mediaFields = [
'images' => AdvancedNovaMediaLibrary::make('Images', 'images')
->onlyImages()
->maxSize(5),
];
php artisan nova:serve and visit the Nova dashboard to see the new media field.$mediaFields.public), and thumbnails are generated automatically (if Spatie’s media-library is set up).AdvancedNovaMediaLibrary::make('Documents', 'documents')
->onlyFiles()
->allowedFileExtensions(['pdf', 'docx']);
->minSize(1)
->maxSize(10);
->disk('s3');
$model->images->first()->getUrl(); // Returns full URL
$model->images->first()->getPath(); // Returns disk path
media-library to generate thumbnails (e.g., convert or imagick drivers). The Nova tool will respect these settings.resolveForDisplay() or resolveForUpdate() in your resource.public function fields(Request $request)
{
$fields = [...];
if ($request->has('is_featured')) {
$fields[] = AdvancedNovaMediaLibrary::make('Featured Image', 'featured_image')
->onlyImages()
->minSize(1);
}
return $fields;
}
public function jsonApiFields(Request $request)
{
return [
'media_url' => function () {
return $this->images->first()?->getUrl();
},
];
}
Disk Mismatch:
disk setting matches your Spatie media-library config. Files uploaded via Nova won’t appear in the model if disks differ.config/advanced-nova-media-library.php and config/filesystems.php.Thumbnail Generation Failures:
media-library is configured with convert or imagick.spatie/laravel-medialibrary package is installed.php artisan media:generate-thumbnails manually.Permission Issues:
chmod -R 775 storage/app/public (adjust as needed).Large File Uploads:
max_file_upload (in config/nova.php) may block large files.max_file_upload (e.g., 10485760 for 10MB) and ensure PHP’s upload_max_filesize and post_max_size are higher.Caching:
php artisan nova:cache-clear
resolved() method to your resource to log media uploads:
public function resolved()
{
\Log::info('Media uploaded:', ['files' => $this->images]);
}
ls storage/app/public
config/nova.php:
'debug' => env('NOVA_DEBUG', false),
Custom Validation:
Override resolveForUpdate() to validate files before saving:
public function resolveForUpdate(Request $request)
{
$data = parent::resolveForUpdate($request);
if (isset($data['images'])) {
foreach ($data['images'] as $file) {
if ($file->getClientOriginalExtension() !== 'jpg') {
throw new \Exception('Only JPG files allowed.');
}
}
}
return $data;
}
Custom Storage Paths: Dynamically set storage paths per model:
AdvancedNovaMediaLibrary::make('Profile Media', 'media')
->disk(function ($model) {
return 'profiles/' . $model->user_id;
});
Event Listeners: Trigger actions on media uploads (e.g., send notifications):
use EBESS\AdvancedNovaMediaLibrary\Events\MediaUploaded;
MediaUploaded::dispatch($model, $fieldName, $files);
Listen in EventServiceProvider:
protected $listen = [
MediaUploaded::class => [YourListener::class],
];
Custom Thumbnail Drivers:
Extend Spatie’s Media model to support additional thumbnail drivers:
// app/Models/Media.php
use Spatie\MediaLibrary\HasMedia;
use Spatie\MediaLibrary\InteractsWithMedia;
class Media extends \Spatie\MediaLibrary\Models\Media
{
public function registerConversions(): void
{
$this->addConversion('custom_thumb')
->width(200)
->height(200)
->driver('imagick'); // or 'convert'
}
}
Batch Processing:
Use Nova’s Action system to process media in bulk:
public function actions(Request $request)
{
return [
(new ProcessMedia($request))->canSee(),
];
}
class ProcessMedia extends Action
{
public function handle($model)
{
foreach ($model->images as $media) {
// Process each file (e.g., resize, optimize)
}
}
}
Soft Deletes: If using Spatie’s soft deletes, ensure Nova’s media field respects it:
AdvancedNovaMediaLibrary::make('Media', 'media')
->softDeletes();
Localization: Translate field labels and buttons by publishing Nova’s language files:
php artisan vendor:publish --tag=nova-lang
How can I help you explore Laravel packages today?