laravel-admin/media-manager
Laravel Media Manager adds an Eloquent Media model for your storage, auto 1‑n media relations via a trait, image styles with caching, and Vue (Bootstrap 3) components for browsing/uploading. Includes upload helper with pluggable drivers and multi-disk support.
Architecture Fit
The laravel-admin/media-manager package provides a media abstraction layer with Eloquent integration, image processing (via Intervention Image), and a Vue.js-based admin interface. It aligns well with Laravel’s convention-over-configuration philosophy** and complements existing Laravel ecosystems like laravel-admin (given the package’s origin). Key architectural strengths:
MediaTrait.thumbnail) leverage Intervention Image, reducing dependency on external services.MediaBrowser.vue) with Dropzone for drag-and-drop uploads, lowering frontend dev effort.Integration Feasibility
Technical Risk
npm install dropzone --save-dev).deleted_at) is robust but assumes proper foreign key constraints (e.g., media_id in related tables).Key Questions
thumbnail) pre-generated or on-demand? On-demand may impact response times.request and url drivers?Stack Fit
media table (migration provided) with deleted_at for soft deletes.MediaBrowser.vue component uses Composition API (check for compatibility with existing Vue setup).Migration Path
composer require laravel-admin/media-manager intervention/image dropzone
npm install dropzone --save-dev
config/app.php:
LaravelAdmin\MediaManager\MediaManagerProvider::class
php artisan vendor:publish --provider="LaravelAdmin\MediaManager\MediaManagerProvider"
php artisan migrate
config/filesystems.php (e.g., S3, local).media_id foreign key to target models (e.g., posts):
$table->foreignId('media_id')->nullable()->constrained()->onDelete('set null');
MediaTrait in models:
use LaravelAdmin\MediaManager\Traits\MediaTrait;
class Post extends Model { use MediaTrait; }
resources/js/app.js:
require('../../../vendor/laravel-admin/media-manager/resources/js/bootstrap.js');
MediaBrowser.vue in your Vue app (e.g., via Laravel Mix or Vite).Route::resource('media', \LaravelAdmin\MediaManager\Http\Controllers\MediaController::class);
AjaxController for custom logic (e.g., linked-object checks):
// app/Http/Controllers/MediaAjaxController.php
class MediaAjaxController extends \LaravelAdmin\MediaManager\Http\Controllers\AjaxController {
public function destroy($id) {
$media = Media::findOrFail($id);
if ($media->isLinked()) {
return response()->json(['error' => 'Linked to objects'], 409);
}
$media->delete();
return response()->json(['success' => true]);
}
}
$media = Upload::handle(request(), 'file');
$post->imagestyle('thumbnail'); // Should return processed URL
$media->delete(); // Sets deleted_at
$media->restore();
Compatibility
Sequencing
MediaTrait into core models (e.g., Post, User).Maintenance
Support
composer require vendor/package:6.1.5).Scaling
media table could grow large; optimize with indexes on disk, mime_type, andHow can I help you explore Laravel packages today?