Installation
Run composer require donjohn/media-bundle in your Laravel project (note: this is a Symfony bundle, but can be adapted for Laravel via Bridge or manually).
Publish the bundle’s assets/config with:
php artisan vendor:publish --provider="Donjohn\MediaBundle\DonjohnMediaBundle"
Define a Media Entity
Extend Donjohn\MediaBundle\Model\Media in your app/Models directory:
namespace App\Models;
use Donjohn\MediaBundle\Model\Media as BaseMedia;
use Illuminate\Database\Eloquent\Model;
class Media extends BaseMedia
{
protected $table = 'media';
}
Run php artisan migrate (ensure donjohn_media migrations are included).
Configure LiipImagine
Add to config/imagine.php (or config/packages/liip_imagine.yaml if using Symfony):
'filter_sets' => [
'full' => ['quality' => 100],
'thumbnail' => [
'quality' => 75,
'filters' => [
'thumbnail' => ['size' => [120, 120], 'mode' => 'outbound'],
],
],
],
First Upload
Use the MediaManager service to upload files:
use Donjohn\MediaBundle\Manager\MediaManager;
$mediaManager = app(MediaManager::class);
$media = $mediaManager->create([
'name' => 'example.jpg',
'path' => 'uploads/example.jpg',
'mimeType' => 'image/jpeg',
]);
$media->save();
File Uploads
MediaManager to handle uploads:
$media = $mediaManager->createFromRequest($request, 'file_field');
$media->save();
donjohn_media.file_allowed_mimes and donjohn_media.file_max_size in config.Image Processing
$media->getPath('thumbnail'); // Returns processed path
config/imagine.php for reuse.Entity Relationships
class Post extends Model
{
public function media()
{
return $this->morphToMany(Media::class, 'model');
}
}
media() helper to attach:
$post->media()->attach($media->id);
Form Integration
FileType (or Laravel’s File request handling) with custom validation:
$request->validate([
'file' => 'required|file|mimes:jpg,png|max:2048',
]);
Custom Storage
Override Donjohn\MediaBundle\Storage\FilesystemStorage to use S3/Flysystem:
class CustomStorage extends FilesystemStorage
{
public function getAdapter()
{
return new \League\Flysystem\Adapter\S3(...);
}
}
Bind it in config/donjohn_media.php:
'storage' => App\Services\CustomStorage::class,
Events
Listen for media.created/media.deleted to trigger actions:
Media::created(function ($media) {
// Send notification, log, etc.
});
API Responses Serialize media with URLs:
return response()->json([
'url' => $media->getUrl(),
'thumbnail' => $media->getUrl('thumbnail'),
]);
LiipImagine Dependency
liip/imagine-bundle (Symfony) or intervention/image (Laravel) causes image processing failures.File Paths in Laravel
public/ path differs from Laravel’s storage/app/public.donjohn_media.upload_folder to storage/app/public/uploads and symlink:
php artisan storage:link
Polymorphic Relations
morphClass in the relation can cause errors.$this->morphToMany(Media::class, 'model')->withPivot('created_at');
Memory Limits
memory_limit.php.ini or use imagine’s cache option to avoid reprocessing.Deleted Files
media.deleted listener to clean up files:
Media::deleted(function ($media) {
if (file_exists($media->path)) {
unlink($media->path);
}
});
Check Upload Paths
Log config('donjohn_media.upload_folder') to verify file storage location.
Validate Filter Sets
Ensure liip_imagine.filter_sets includes all used filters (e.g., thumbnail).
Symfony vs. Laravel Quirks
app_path() instead of __DIR__ for Laravel paths.container()->get() with Laravel’s app() or resolve().Custom Validators
Extend Donjohn\MediaBundle\Validator\Constraints\File to add rules:
class CustomFileValidator extends FileValidator
{
protected function validateSize($value)
{
if ($value > config('donjohn_media.file_max_size')) {
$this->context->addViolation('File too large.');
}
}
}
Dynamic Filter Sets Generate filter sets at runtime:
$media->addFilterSet('custom', [
'filters' => ['thumbnail' => ['size' => [$width, $height]]],
]);
Batch Processing Use queues for heavy image processing:
dispatch(new ProcessMedia($media))->onQueue('media');
How can I help you explore Laravel packages today?