Installation
composer require djvue/d-media-bundle
Add to config/app.php under providers:
Djvue\DMediaBundle\DMediaBundle::class,
Publish config (if needed):
php artisan vendor:publish --provider="Djvue\DMediaBundle\DMediaBundle" --tag=config
First Use Case: Uploading Media
HasMedia.php):
use Djvue\DMediaBundle\Traits\HasMedia;
class Post extends Model
{
use HasMedia;
}
use Djvue\DMediaBundle\Services\MediaService;
public function uploadMedia(Request $request)
{
$media = MediaService::upload($request->file('media'), 'posts');
return response()->json($media);
}
Key Config
Check config/d-media.php for:
disks, folders).allowed_mimes).local, s3).Model Integration
HasMedia trait to attach media to models:
class Post extends Model
{
use HasMedia;
protected $mediaableType = 'App\Models\Post';
}
$post->media()->first(); // Returns a Media model
Service Layer
$media = MediaService::upload($file, 'posts', ['tags' => ['cover']]);
MediaService::delete($media->id);
$media->url(); // Returns full URL (configurable)
Validation
Djvue\DMediaBundle\Rules\Media for custom validation:
$request->validate([
'media' => ['required', new Media(['max_size' => 5120])],
]);
Events
media.uploaded or media.deleted:
event(new MediaUploaded($media));
config('d-media.disks') to map to Laravel’s filesystem.toArray() or toJson():
return $media->toArray(); // Includes 'url', 'path', 'mime', etc.
url() method directly in Blade:
<img src="{{ $post->media->first()->url }}" />
Missing Config
config/d-media.php for misconfigured disks or folders.local disk assumes storage/app/media exists. Create it if missing:
mkdir -p storage/app/media
Permission Issues
chmod -R 775 storage/app/media
.env and config/filesystems.php.Trait Conflicts
media() method if your model already has one. Rename the trait method or override:
public function getMediaAttribute() { ... }
MIME Type Restrictions
allowed_mimes config array or override the validateMimeType method in MediaService.config/d-media.php:
'debug' => env('APP_DEBUG', false),
php artisan event:listen to debug media.* events.Storage::disk('media')->path('');
Custom Storage
Override the getDisk() method in MediaService:
protected function getDisk($folder = null)
{
return Storage::disk('custom-disk-name');
}
Post-Processing
Hook into media.uploaded to process files (e.g., generate thumbnails):
MediaUploaded::subscribe(function ($media) {
// Run FFmpeg, ImageMagick, etc.
});
Model Policies Restrict media access with Laravel’s Policies:
class MediaPolicy
{
public function delete(User $user, Media $media)
{
return $user->id === $media->user_id;
}
}
Testing
Mock MediaService in tests:
$this->partialMock(MediaService::class, ['upload']);
How can I help you explore Laravel packages today?