Install Dependencies
composer require ano/media-bundle knplabs/gaufrette avalanche123/imagine
Ensure AnoSystemBundle is installed (or manually replicate its DIC utilities).
Configure config.yml
Add basic filesystem, CDN, and provider configurations:
ano_media:
filesystem:
local:
default: true
id: ano_media.filesystem.local
options:
base_path: "%kernel.root_dir%/../medias"
create: true
cdn:
local:
default: true
id: ano_media.cdn.remote_server
options:
base_url: "http://img.example.com"
provider:
image:
default: true
id: ano_media.provider.image
contexts:
user_picture:
formats:
small: { width: 50, height: 50 }
medium: { width: 90, height: 90 }
Create a Base Media Model
Extend Ano\Bundle\MediaBundle\Model\Media:
namespace App\Model;
use Ano\Bundle\MediaBundle\Model\Media as BaseMedia;
abstract class Media extends BaseMedia {}
Define a Context-Specific Model
namespace App\Model;
class UserPicture extends Media {
protected $context = 'user_picture';
}
Use in a Form
$form = $this->createFormBuilder($user)
->add('picture', FileType::class)
->getForm();
Handle Upload in Controller
$userPicture = new UserPicture();
$userPicture->setContent($form->get('picture')->getData());
$user->setPicture($userPicture);
$em->persist($user);
$em->flush();
Upload and generate thumbnails for a user avatar. The bundle automatically:
user_picture).Context-Driven Media Handling
config.yml to group media types (e.g., user_picture, article_image).image, video) and formats (e.g., thumbnails).contexts:
article_image:
formats:
thumbnail: { width: 200, height: 200 }
preview: { width: 800, height: 600 }
Provider Integration
ano_media.provider.image for images (requires Imagine).VideoProvider for metadata extraction).class MyService {
public function __construct(\Ano\Bundle\MediaBundle\Provider\ProviderInterface $imageProvider) {}
}
Filesystem Abstraction
ano_media.filesystem.filesystem:
s3:
id: ano_media.filesystem.s3
options:
service: aws_s3
ORM Integration
UserPicture entity:
class UserPicture extends Media {
protected $context = 'user_picture';
}
<discriminator-map>
<discriminator-mapping value="user_picture" class="App\Model\UserPicture" />
</discriminator-map>
Form Handling
$media = new UserPicture();
$media->setContent($request->files->get('picture'));
FileType in forms:
$builder->add('image', FileType::class, [
'mapped' => false, // MediaBundle handles persistence
]);
CDN and URL Generation
MediaManager:
$url = $this->mediaManager->getUrl($media, 'small');
ano_media.cdn:
cdn:
cloudfront:
base_url: "https://cdn.example.com"
MediaPostUploadEvent).PdfProvider).File, MimeType) alongside media-specific rules.config/bundles.php:
return [
// ...
Ano\Bundle\MediaBundle\AnoMediaBundle::class => ['all' => true],
];
Missing AnoSystemBundle
remapParameters logic in MediaExtension.php:
$loader->addRemapping('ano_media', '@AnoMediaBundle/Resources/config');
Filesystem Permissions
base_path in ano_media.filesystem is writable:
chmod -R 775 %kernel.root_dir%/../medias
Context-Provider Mismatch
user_picture) exists in config.yml.image) is enabled and configured.Imagine library is installed for image manipulation.STI Discriminator Conflicts
<!-- Wrong: Duplicate 'media' -->
<discriminator-mapping value="media" class="App\Model\Media" />
<discriminator-mapping value="media" class="App\Model\UserPicture" />
CDN Caching Issues
base_url: "http://localhost:8000/medias".Symfony 4+ Autowiring
public function __construct(
private MediaManagerInterface $mediaManager,
private ProviderInterface $imageProvider
) {}
MediaEvents:
monolog:
handlers:
main:
level: debug
$provider = $this->container->get('ano_media.provider.image');
var_dump($provider->getContexts());
php bin/console debug:config ano_media
Custom Providers
ProviderInterface and register in services.yml:
services:
app.media.provider.pdf:
class: App\Provider\PdfProvider
tags:
- { name: ano_media.provider, type: pdf }
Event Subscribers
MediaPostUploadEvent):
class MySubscriber implements EventSubscriberInterface {
public static function getSubscribedEvents() {
return [
MediaEvents::POST_UPLOAD => 'onMediaUpload',
];
}
public function onMediaUpload(MediaPostUploadEvent $event) {
// Custom logic (e.g., send notification)
}
}
Dynamic Contexts
class DynamicContextPass implements CompilerPassInterface {
public function process(ContainerBuilder $container) {
$contexts = $this->loadContextsFromDatabase();
$container->setParameter('ano_media.contexts', $contexts);
}
}
Override Default Services
MediaManager or Filesystem implementations:
services:
ano_media.media_manager:
class: App\Service\CustomMediaManager
arguments: ['@ano_media.filesystem.local']
Add Custom Metadata
Media base class to include fields like alt_text or copyright:
class Media extends BaseMedia {
protected $altText;
// Getters/setters...
}
How can I help you explore Laravel packages today?