5. Media Context
When a site has to handle pictures, you can have different type of pictures: news pictures, users pictures etc. But in the end pictures require the same features: resize, cdn and database relationship with entities.
The MediaBundle
tries to solve this situation by introducing context
:
a context has its own set of media providers and its own set of formats.
That means you can have a small
user picture format and a small
news
picture format with different sizes and providers.
By setting constraint
to false
, the uploaded picture can be smaller than
the defined size(s).
Also each format allows to use a custom resizer instead of the default one configured in the provider:
# config/packages/sonata_media.yaml
sonata_media:
contexts:
default: # the default context is mandatory
providers:
- sonata.media.provider.dailymotion
- sonata.media.provider.youtube
- sonata.media.provider.image
- sonata.media.provider.file
formats:
small: { width: 100, quality: 70 }
big: { width: 500, quality: 70, resizer: sonata.media.resizer.square }
news:
providers:
- sonata.media.provider.youtube
- sonata.media.provider.image
formats:
small: { width: 150, quality: 95 }
big: { width: 500, quality: 90, constraint: false }
5.1. AdminBundle
Integration
When you create a new blog post, you might want to link an image to that post.
Doctrine ORM:
<many-to-one
field="image"
target-entity="Application\Sonata\MediaBundle\Entity\Media"
>
<cascade>
<cascade-all/>
</cascade>
</many-to-one>
In the PostAdmin
, you can add a new field image
with a link_parameters
option. This option will add an extra parameter into the add
link. This
parameter will be used by the related controller:
public function configureFormFields(FormMapper $form): void
{
$form
->add('image', 'sonata_type_model_list', [], ['link_parameters' =>['context' => 'news']]);
}
If you look in the MediaAdmin
class, the class defined a configurePersistentParameters()
method. This method allows you to define persistent parameters across the
MediaAdminController
. Depending on the action, the parameter can change
the Admin behaviors:
protected function configurePersistentParameters(): array
{
if (!$this->getRequest()) {
return [];
}
return [
'provider' => $this->getRequest()->get('provider'),
'context' => $this->getRequest()->get('context'),
];
}
list: filters the list to display only one
context
create: creates a new media asset with the provided
context