baconmanager/media-library-bundle
Installation
composer require baconmanager/media-library-bundle
Ensure your AppKernel.php includes the required bundles in this order:
new Oneup\UploaderBundle\OneupUploaderBundle(),
new Knp\Bundle\GaufretteBundle\KnpGaufretteBundle(),
new Liip\ImagineBundle\LiipImagineBundle(),
new Bacon\Bundle\MediaLibraryBundle\BaconMediaLibraryBundle(),
new FOS\JsRoutingBundle\FOSJsRoutingBundle(),
Configuration Import the default config:
# app/config/config.yml
imports:
- { resource: "@BaconMediaLibraryBundle/Resources/config/config.yml" }
Add routing:
# app/config/routing.yml
bacon_media_library:
resource: "@BaconMediaLibraryBundle/Controller/"
type: annotation
prefix: /media-library
First Use Case Run migrations (if provided) and clear cache:
php bin/console doctrine:migrations:migrate
php bin/console cache:clear
Access /media-library to test the UI. Upload a file via the frontend form to verify the integration with OneupUploaderBundle and LiipImagineBundle.
Media Upload
BaconMediaLibraryBundle:Media:upload).oneup_uploader in config.yml to define storage adapters (e.g., gaufrette for local/S3):
oneup_uploader:
mappings:
media:
frontend: true
upload_directory: '%kernel.root_dir%/../web/uploads/media'
LiipImagineBundle (configure filters in liip_imagine section).Media Management
BaconMediaLibraryBundle:Media:list (or create a custom controller extending MediaController).?type=image&sort=created_at).Integration with Entities
media_ids field (e.g., ManyToMany with BaconMediaLibraryBundle\Model\Media).// src/AppBundle/Entity/Article.php
/**
* @ORM\ManyToMany(targetEntity="Bacon\Bundle\MediaLibraryBundle\Model\Media")
*/
private $media;
Custom Templates
app/Resources/BaconMediaLibraryBundle/views/ (e.g., Media/upload.html.twig).list.html.twig to add custom columns or actions.Event Listeners
Use the bundle’s events (e.g., media.pre_upload) to validate files or log uploads:
// src/AppBundle/EventListener/MediaListener.php
public function onPreUpload(MediaEvent $event) {
$file = $event->getFile();
if ($file->getClientOriginalExtension() === 'exe') {
throw new \RuntimeException('Executables not allowed.');
}
}
Register in services.yml:
services:
app.media_listener:
class: AppBundle\EventListener\MediaListener
tags:
- { name: kernel.event_listener, event: media.pre_upload, method: onPreUpload }
API Endpoints
Create a custom API controller extending MediaController to expose media via JSON:
use Bacon\Bundle\MediaLibraryBundle\Controller\MediaController;
class ApiMediaController extends MediaController {
public function listAction() {
$media = $this->getMediaManager()->findAll();
return $this->json($media);
}
}
Dependency Order
BaconMediaLibraryBundle relies on OneupUploaderBundle and LiipImagineBundle. Misordering in AppKernel.php causes errors.OneupUploaderBundle → KnpGaufretteBundle → LiipImagineBundle → BaconMediaLibraryBundle.Missing Migrations
Media entity. Manually create one if needed:
php bin/console doctrine:migrations:diff
src/Resources/config/doctrine/ for entity definitions.Gaufrette Configuration
KnpGaufretteBundle, ensure the adapter is properly configured in config.yml:
knp_gaufrette:
adapters:
media_adapter:
local:
directory: '%kernel.root_dir%/../web/uploads/media'
filesystems:
media:
adapter: media_adapter
oneup_uploader mappings point to the correct filesystem:
oneup_uploader:
mappings:
media:
filesystem: media
JavaScript Routing
FOSJsRoutingBundle for AJAX. If routes fail, ensure:
// app/Resources/public/js/app.js
var routes = Routing.generate();
is loaded before the bundle’s JS.Thumbnail Generation
LiipImagineBundle filters are misconfigured.config.yml:
liip_imagine:
filter_sets:
media_thumbnail:
quality: 75
filters:
thumbnail: { size: [200, 200], mode: outbound }
Then reference them in the bundle’s config:
bacon_media_library:
thumbnail_filter: media_thumbnail
Check Uploads Directory
Ensure upload_directory in oneup_uploader mappings is writable:
chmod -R 775 %kernel.root_dir%/../web/uploads/media
Symfony Profiler
Use the profiler to inspect MediaEvent objects during uploads:
// In a listener
dump($event->getFile()->getClientOriginalName());
Log Events Enable debug logging for the bundle:
# app/config/config_dev.yml
monolog:
handlers:
media:
type: stream
path: "%kernel.logs_dir%/media.log"
level: debug
Custom Media Types
Extend the Media entity to add fields (e.g., alt_text, caption):
// src/AppBundle/Entity/MediaExtension.php
use Bacon\Bundle\MediaLibraryBundle\Model\Media;
class MediaExtension extends Media {
/**
* @ORM\Column(type="string", nullable=true)
*/
private $caption;
}
Register as a service override:
services:
bacon.media.class: AppBundle\Entity\MediaExtension
Custom Actions Add buttons to the media list via Twig:
{# app/Resources/BaconMediaLibraryBundle/views/Media/list.html.twig #}
<td>
<a href="{{ path('app_media_download', { id: media.id }) }}" class="btn btn-default">
<i class="glyphicon glyphicon-download"></i>
</a>
Create a route and controller for app_media_download.
Bulk Operations
Implement a bulk delete action by extending the MediaController:
public function bulkDeleteAction(Request $request) {
$ids = $request->request->get('media_ids');
$this->getMediaManager()->removeByIds($ids);
return $this->redirect($this->generateUrl('bacon_media_library_list'));
}
How can I help you explore Laravel packages today?