Installation:
composer require alpixel/mediabundle:~2.0
Ensure your composer.json includes liip/imagine-bundle (required dependency).
Register the Bundle:
Add to app/AppKernel.php:
new Alpixel\Bundle\MediaBundle\AlpixelMediaBundle(),
Configure Uploads:
Update config.yml:
alpixel_media:
upload_folder: "%kernel.root_dir%/../web/upload/"
allowed_mimetypes: ['image/*', 'application/pdf']
Enable Routing:
Include in app/config/routing.yml:
alpixel_media:
resource: '@AlpixelMediaBundle/Resources/config/routing.yml'
Twig Setup: Add Twig resources:
twig:
form:
resources: ['AlpixelMediaBundle:Form:fields.html.twig']
Update Database: Run:
php app/console doctrine:schema:update --force
Create a Form Type:
Extend AlpixelMediaBundle\Form\Type\MediaType or use it directly in your form:
$builder->add('media', 'alpixel_media', [
'label' => 'Upload Media',
'mapped' => false,
]);
Handle Upload in Controller:
$media = new \Alpixel\Bundle\MediaBundle\Entity\Media();
$media->setFile($request->files->get('media'));
$em->persist($media);
$em->flush();
Display Media in Twig:
<img src="{{ media|media_url({filter: 'admin'}) }}" />
Media entity or extend it:
use Alpixel\Bundle\MediaBundle\Entity\Media;
class MyMedia extends Media { /* Custom fields */ }
MediaType form field for drag-and-drop (Dropzone.js) or standard uploads:
{{ form_start(form) }}
{{ form_row(form.media) }}
{{ form_end(form) }}
config.yml and validate in the controller:
$media->validate(); // Throws \Exception if invalid
config.yml for LiipImagine:
liip_imagine:
filter_sets:
thumbnail:
quality: 75
filters:
thumbnail: { size: [200, 200], mode: outbound }
<img src="{{ media|media_url({filter: 'thumbnail'}) }}" />
Or manually in the controller:
$url = $this->get('alpixel_media.media_url_generator')->generateUrl(
$media,
['filter' => 'thumbnail']
);
media_url filter for dynamic URLs:
{# SEO-friendly public URL #}
{{ media|media_url({public: true}) }}
{# Absolute URL #}
{{ media|media_url({absolute: true}) }}
{# Download link #}
<a href="{{ media|media_url({action: 'download'}) }}">Download</a>
MediaController@showMediaAction:
$router = $this->get('router');
$url = $router->generate('alpixel_media_show', [
'id' => $media->getId(),
'action' => 'show',
'filter' => 'thumbnail',
]);
php app/console alpixel:media:cleanup
MediaCommand base class for custom logic./**
* @ORM\OneToMany(targetEntity="Alpixel\Bundle\MediaBundle\Entity\Media", mappedBy="owner")
*/
private $media;
$media->addListener(new \Alpixel\Bundle\MediaBundle\EventListener\MediaListener());
Media entity to add fields (e.g., altText, caption):
class ProductImage extends Media {
/**
* @ORM\Column(type="string", length=255)
*/
private $altText;
}
$builder->add('altText', 'text');
{% include 'AlpixelMediaBundle:Form:dropzone.html.twig' %}
{% set dropzoneOptions = {
url: path('alpixel_media_upload'),
maxFilesize: 5,
acceptedFiles: 'image/*,application/pdf'
} %}
$media->setFile($file);
$media->validate(); // Throws on failure
security.yml:
access_control:
- { path: ^/upload/, roles: ROLE_USER }
liip_imagine:
filter_sets:
cache:
cache: my_cache
MediaUrlGenerator and MediaManager services:
$generator = $this->getMockBuilder('Alpixel\Bundle\MediaBundle\Generator\MediaUrlGenerator')
->disableOriginalConstructor()
->getMock();
HttpFoundation:
$file = new \Symfony\Component\HttpFoundation\File\UploadedFile(
__DIR__.'/fixtures/test.jpg',
'test.jpg'
);
$crawler = $this->client->request('POST', '/upload', ['media' => $file]);
<randomMedia> Twig function (deprecated in v2.2.0). Use media_url instead.liip/imagine-bundle is installed and configured. Missing filters will break image processing:
composer require liip/imagine-bundle
FilterSetNotFoundException if filter_sets are misconfigured in config.yml.Permission denied if upload_folder lacks write permissions.
Fix:
chmod -R 775 %kernel.root_dir%/../web/upload/
chown -R www-data:www-data %kernel.root_dir%/../web/upload/
/upload/filename.jpg) may expose sensitive paths.
Mitigation: Use public: false in media_url or restrict access via .htaccess.doctrine:schema:update without --force may fail if the Media table exists but is outdated.
Fix: Use --force or manually drop the table first.$(document).ready() or use data-dz-options.post_max_size, upload_max_filesizeHow can I help you explore Laravel packages today?