Installation Add the package via Composer:
composer require darkanakin41/media-bundle
Register the bundle in config/bundles.php (Symfony 4+):
return [
// ...
Darkanakin41\MediaBundle\MediaBundle::class => ['all' => true],
];
Configuration Publish the default config (Symfony 4+):
php bin/console darkanakin41:media:install
Update config/packages/darkanakin41_media.yaml to define:
upload_dir: Local storage path (e.g., uploads/media).allowed_mimes: File types (e.g., ['image/jpeg', 'image/png']).resize_options: Default dimensions (e.g., {'width': 800, 'height': 600}).First Upload
Use the MediaUploader service in a controller:
use Darkanakin41\MediaBundle\Service\MediaUploader;
public function upload(Request $request, MediaUploader $uploader)
{
$file = $request->file('media');
$path = $uploader->upload($file, 'user_uploads');
return response()->json(['path' => $path]);
}
File Uploads
$path = $uploader->upload($request->file('image'), 'category_x');
$paths = $uploader->uploadMultiple($request->file('images'), 'gallery');
Image Resizing
Integrate with MediaResizer:
$resizer = $this->container->get('darkanakin41_media.resizer');
$resizedPath = $resizer->resize($originalPath, ['width' => 400]);
Validation
Use the MediaValidator to check file types/sizes:
$validator = $this->container->get('darkanakin41_media.validator');
if (!$validator->isAllowed($file)) {
throw new \Exception('Invalid file type.');
}
Symfony Forms:
Add a FileType field and validate with MediaValidator in a custom constraint.
$builder->add('media', FileType::class, [
'constraints' => [new MediaConstraint($validator)],
]);
Storage Abstraction:
Extend the StorageInterface to support cloud storage (e.g., S3) by implementing:
class S3Storage implements StorageInterface {
public function save($file, $path) { /* ... */ }
public function getUrl($path) { /* ... */ }
}
Register it in services.yaml:
services:
Darkanakin41\MediaBundle\Service\StorageInterface: '@app.s3_storage'
Event Listeners: Trigger actions post-upload (e.g., generate thumbnails):
use Darkanakin41\MediaBundle\Event\MediaUploadedEvent;
public function onMediaUploaded(MediaUploadedEvent $event)
{
$resizer->resize($event->getPath(), ['width' => 150]);
}
Bind in services.yaml:
services:
App\Listener\ThumbnailListener:
tags:
- { name: kernel.event_listener, event: media.uploaded, method: onMediaUploaded }
No Documentation
src/Service/MediaUploader.php (core logic).tests/ (basic examples).width, height, quality) must match the internal ResizeOptions class.Light Testing
if ($file->getSize() > 10_000_000) { // 10MB
throw new \RuntimeException('File too large.');
}
Hardcoded Paths
upload_dir config uses relative paths. Ensure the directory exists:
mkdir -p uploads/media
chmod -R 775 uploads/media
No Database Integration
use Darkanakin41\MediaBundle\Traits\MediaLogger;
class UserMedia {
use MediaLogger;
protected $table = 'user_media';
}
Failed Uploads:
Check var/log/dev.log for MediaException. Common causes:
upload_dir permission.allowed_mimes in config).upload_max_filesize limits.Resize Issues:
Ensure gd or imagick PHP extensions are installed:
php -m | grep -E 'gd|imagick'
Custom Storage
Override StorageInterface to support:
LocalStorage).Flysystem adapter.Post-Processing
Extend MediaUploader to auto-generate variants:
class ExtendedUploader extends MediaUploader {
protected function postUpload($path) {
$this->resizer->resize($path, ['width' => 300]); // Thumbnail
$this->resizer->resize($path, ['width' => 1200]); // Large
}
}
Bind in services.yaml:
services:
Darkanakin41\MediaBundle\Service\MediaUploader: '@app.extended_uploader'
Security Sanitize filenames to prevent path traversal:
$safeName = preg_replace('/[^a-z0-9._-]/i', '_', $file->getClientOriginalName());
$uploader->upload($file, 'safe_dir', $safeName);
Symfony Messenger
Decouple uploads from HTTP requests by dispatching a MediaUploadMessage:
use Darkanakin41\MediaBundle\Message\MediaUploadMessage;
$bus->dispatch(new MediaUploadMessage($file, 'async_dir'));
Configure the handler in config/packages/messenger.yaml:
frameworks:
messenger:
transports:
async: '%env(MESSENGER_TRANSPORT_DSN)%'
routing:
'Darkanakin41\MediaBundle\Message\MediaUploadMessage': async
Resize Quality:
Default quality is 75. Override in config:
resize_options:
quality: 90
Case-Sensitive MIME Checks:
Ensure allowed_mimes matches exact MIME strings (e.g., image/jpeg vs. JPEG).
No Auto-Cleanup: Deleted files aren’t purged. Implement a cron job:
php bin/console darkanakin41:media:cleanup --dir=uploads/media --dry-run
(Note: Command may not exist; check src/Command/ for available commands.)
How can I help you explore Laravel packages today?