(16) 981791110 contato@policast.studio

O que é o SonataMediaBundle?

O SonataMediaBundle é um pacote completo de gerenciamento de mídia baseado em Symfony, que fornece recursos como upload de imagem / arquivo, manipulação de imagem / arquivo, integração com FFMpeg, regras personalizadas de validação e bem mais.

O principal objetivo deste pacote é facilitar o gerenciamento de mídia para qualquer sistema Symfony. Com a ajuda deste pacote, os desenvolvedores podem facilmente lidar com o upload de arquivos complexos e manipulação de mídia. O pacote também fornece uma interface de gerenciamento pronta para uso, permitindo que as mídias sejam facilmente acessíveis e organizáveis ​​em uma única interface.

Além disso, o SonataMediaBundle oferece uma integração fácil com outros pacotes Sonata, como o SonataAdminBundle e o SonataPageBundle, uma vez que é construído em cima da SonataCoreBundle.

Como instalar o SonataMediaBundle?

Para instalar o SonataMediaBundle, acesse o terminal e execute o seguinte comando:

composer require sonata-project/media-bundle

Isso iniciará o processo de download e instalação do pacote. Após a instalação, adicione as configurações de banco de dados para o pacote em ‘app/config/config.yml’.

sonata_media:
db_driver: doctrine_orm # or doctrine_mongodb, doctrine_phpcr
contexts:
default:
providers:
- sonata.media.provider.image
- sonata.media.provider.file

Depois disso, execute o seguinte comando no terminal:

php bin/console doctrine:schema:update --force

Este comando atualizará o banco de dados com as tabelas necessárias para que o pacote seja executado.

Como utilizar o SonataMediaBundle?

Para começar a usar o SonataMediaBundle, crie uma entidade para armazenar o arquivo/mídia. Em seguida, adicione a propriedade sonata_type_model para o arquivo/mídia.

// src/Acme/DemoBundle/Entity/Product.php

namespace AcmeDemoBundleEntity;

use DoctrineORMMapping as ORM;
use SonataMediaBundleEntityBaseMedia as BaseMedia;

/**
* @ORMEntity
* @ORMTable(name="product")
*/
class Product {

...

/**
* @ORMManyToOne(targetEntity="ApplicationSonataMediaBundleEntityMedia")
* @ORMJoinColumn(nullable=true)
*/
private $media;

/**
* @ORMColumn(type="string", length=255, nullable=true)
*/
private $description;

...

public function setMedia(ApplicationSonataMediaBundleEntityMedia $media = null) {
$this->media = $media;
}

public function getMedia() {
return $this->media;
}

...
}

Em seguida, adicione a configuração do form na entidade.

// src/Acme/DemoBundle/Admin/ProductAdmin.php

namespace AcmeDemoBundleAdmin;

...

use SonataAdminBundleFormFormMapper;
use SonataAdminBundleAdminAbstractAdmin;

class ProductAdmin extends AbstractAdmin {

...

protected function configureFormFields(FormMapper $formMapper) {
$edit = $this->getSubject()->getId() !== null;

$formMapper
->add('description');

if (!$edit) {
$formMapper->add('media', 'sonata_type_model_list', array('required' => false), array(
'link_parameters' => array(
'provider' => 'sonata.media.provider.file',
'context' => 'default'
)
));
} else {
$formMapper
->add('media', 'sonata_type_model_list', array(
'required' => false,
'btn_list' => false,
'btn_delete' => false
), array(
'link_parameters' => array(
'provider' => 'sonata.media.provider.file',
'context' => 'default'
)
));
}
}

...
}

Por fim, atualize a entidade para refletir as modificações de formulário:

// src/Acme/DemoBundle/Entity/Product.php

namespace AcmeDemoBundleEntity;

use DoctrineORMMapping as ORM;
use SonataMediaBundleEntityBaseMedia as BaseMedia;

/**
* @ORMEntity
* @ORMTable(name="product")
*/
class Product {

...

/**
* @ORMManyToOne(targetEntity="ApplicationSonataMediaBundleEntityMedia",cascade={"persist"})
*/
private $media;

...

}

Isso é tudo! Com isso, agora você pode carregar arquivos/mídias em seu formulário de produto.

Como integrar FFMpeg com o SonataMediaBundle?

O FFMpeg é uma biblioteca amplamente utilizada para conversão e manipulação de mídia. O SonataMediaBundle tem uma integração muito conveniente com o FFMpeg. Para integrar o FFMpeg com o SonataMediaBundle, primeiro você precisa instalar a biblioteca FFMpeg. Você pode instalar com o seguinte comando:

sudo apt-get install ffmpeg

Depois disso, você precisará instalar o pacote sonata-project/ffmpeg-bundle:

composer require sonata-project/ffmpeg-bundle

Após a instalação, adicione a seguinte configuração em config.yml:

//app/config/config.yml

sonata_media:
...
cdn:
server:
path: "http://localhost"
ffmpeg:
ffmpeg_binary: /usr/local/bin/ffmpeg
ffprobe_binary: /usr/local/bin/ffprobe

Isso configurará o pacote FFMpeg para o SonataMediaBundle.

Como criar regras personalizadas de validação com o SonataMediaBundle?

Para criar regras customizadas de validação para o SonataMediaBundle, você precisará criar um serviço e estendê-lo a partir de uma classe disponível em SonataMediaBundle.

// src/Acme/DemoBundle/Validator/ImageValidator.php

namespace AcmeDemoBundleValidator;

use SymfonyComponentValidatorConstraint;
use ValidatorConstraintsImageValidator as BaseImageValidator;

class ImageValidator extends BaseImageValidator {

public function validate($value, Constraint $constraint) {
parent::validate($value, $constraint);

$media = $constraint->getMedia();
$dimension = $media->getBox();

// Verifique se o tamanho de imagem carregada é equivalente às dimensões desejadas

if (($dimension[0] !== $value->getImageWidth()) && ($dimension[1] !== $value->getImageHeight())) {
$this->context->addViolation(
$constraint->message,
array(
'%width%' => $dimension[0],
'%height%' => $dimension[1]
)
);
}
}

}

Em seguida, adicione a configuração de validação em ‘app/config/services.yml’

services:
validator.unique_key_constraint:
class: AcmeDemoBundleValidatorImageValidator
tags:
- { name: validator.constraint_validator, alias: acme_demoimage }

Isso adicionará um novo validador ao sistema para o SonataMediaBundle.

Como integrar o SonataMediaBundle com SonataAdminBundle?

Para integrar o SonataMediaBundle com o SonataAdminBundle, você precisa criar uma classes Admin para a entidade que contém uma propriedade de mídia. Adicione a seguinte configuração na classe Admin:

// src/Acme/DemoBundle/Admin/ProductAdmin.php

namespace AcmeDemoBundleAdmin;

use SonataAdminBundleFormFormMapper;
use SonataAdminBundleAdminAbstractAdmin;
use SonataMediaBundleFormTypeMediaType;

class ProductAdmin extends AbstractAdmin {

...

protected function configureFormFields(FormMapper $formMapper) {
$edit = $this->getSubject()->getId() !== null;

$formMapper
->add('description')
->add('media', MediaType::class, array(
'provider' => 'sonata.media.provider.image',
'context' => 'default'
));

...
}

...
}

Com isso, o campo de mídia será criado para acesso fácil e rápido ao gerenciamento de mídia.

Como estender o SonataMediaBundle?

O SonataMediaBundle pode ser facilmente estendido para atender às suas necessidades específicas. Você pode sobrescrever os modelos padrão do pacote, adicionar métodos extras de imagem, filtragem de arquivos, etc.

Para fazer isso, você pode usar o mecanismo de herança disponível em Symfony. Faça uma cópia dos arquivos padrão do pacote no seu diretório de aplicativo e faça as mudanças necessárias. O pacote usará os modelos estendidos em vez dos padrões.

Qual é o papel do serviço de contexto do SonataMediaBundle?

O contexto é uma entidade que representa um conjunto de provedores de média e configuração. Cada contexto é definido por um conjunto de parâmetros como cache, provedores de média, formatos de mídia, etc.

Com essa abordagem, o contexto permite que você defina várias configurações para as mídias do seu site, como redimensionamento, recorte, qualidade de imagem e codecs específicos. Cada contexto pode ser usado em diferentes seções do seu site (front-end ou back-end), permitindo um alto nível de flexibilidade.

Como fazer upload de arquivos com o SonataMediaBundle?

Para fazer o upload de arquivos com o SonataMediaBundle, você precisará criar uma entidade para armazenar o arquivo. Adicione a propriedade sonata_type_model para a entidade que contém a propriedade referente ao arquivo de modelo. Em seguida, configure o formulário para exibir a propriedade de upload do arquivo e adicione-o à entidade.

Por exemplo, suponha que você tenha uma entidade Product e queira adicionar uma imagem a ele. Para isso, você pode adicionar uma propriedade de imagem ao Product e configurar o formulário para incluir o upload do arquivo. O código abaixo demonstra como isso pode ser feito:

// src/Acme/DemoBundle/Entity/Product.php

namespace AcmeDemoBundleEntity;

use DoctrineORMMapping as ORM;
use SonataMediaBundleEntityBaseMedia as BaseMedia;

/**
* @ORMEntity
* @ORMTable(name="product")
*/
class Product {

...

/**
* @ORMManyToOne(targetEntity="ApplicationSonataMediaBundleEntityMedia")
* @ORMJoinColumn(nullable=true)
*/
private $media;

/**
* @ORMColumn(type="string", length=255, nullable=true)
*/
private $description;

...

public function setMedia(ApplicationSonataMediaBundleEntityMedia $media = null) {
$this->media = $media;
}

public function getMedia() {
return $this->media;
}

...
}

Em seguida, adicione o formulário de upload na classe Admin:

// src/Acme/DemoBundle/Admin/ProductAdmin.php

namespace AcmeDemoBundleAdmin;

use SonataAdminBundleFormFormMapper;
use SonataAdminBundleAdminAbstractAdmin;
use SonataMediaBundleFormTypeMediaType;

class ProductAdmin extends AbstractAdmin {

...

protected function configureFormFields(FormMapper $formMapper) {
$edit = $this->getSubject()->getId() !== null;
$formMapper
->add('description')
->add('media', MediaType::class, array(
'provider' => 'sonata.media.provider.image',
'context' => 'default'
));
}

...
}

Com essas configurações, você pode facilmente fazer o upload de arquivos para o seu modelo em seu formulário.

Como manipular imagens com o SonataMediaBundle?

O SonataMediaBundle permite a manipulação de imagens para torná-las compatíveis com diferentes dispositivos e resoluções. Para utilizar esses recursos, você precisa configurar a resolução das imagens para diferentes dispositivos. Suponha que você tenha uma imagem de dimensão 800 X 600. Você deseja exibir a imagem em três resoluções diferentes: 400 x 300 para dispositivos móveis, 800 x 600 para dispositivos desktop e 1024 x 768 para dispositivos de alta resolução. Para isso, você pode definir diferentes resoluções como:

// app/config/config.yml

sonata_media:
...
cdn:
server:
path: "http://localhost"
contexts:
default:
providers:
- sonata.media.provider.image
- sonata.media.provider.file
formats:
small: { width: 400, quality: 70 }
default: { width: 800, quality: 70 }
big: { width: 1024, quality: 70 }

Com essas configurações, você pode facilmente exibir imagens em diferentes resoluções. Para exibir uma imagem em diferentes resoluções, use a função ‘path’ do pacote MediaPlayer:

// src/Acme/DemoBundle/Resources/views/default/show.html.twig

{{ mediaItem|sonata_media_filter('small') }}
{{ mediaItem|sonata_media_filter('default') }}
{{ mediaItem|sonata_media_filter('big') }}

Com isso, a imagem será exibida em diferentes resoluções.

Como filtrar imagens com o SonataMediaBundle?

Você pode facilmente filtrar as imagens com o SonataMediaBundle. O pacote fornece vários filtro como adição de marca d’água, redimensionamento, recorte e conversão para diferentes formatos de arquivos.

Para filtrar uma imagem, você pode usar o método ‘sonata_media_filter’ disponível no pacote. Por exemplo, para redimensionar uma imagem para uma largura específica, use:

// src/Acme/DemoBundle/Resources/views/default/show.html.twig

{{ mediaItem|sonata_media_filter('width_300') }}

Defina esta configuração no arquivo config.yml:

// app/config/config.yml

sonata_media:
...
cdn:
server:
path: "http://localhost"
contexts:
default:
providers:
- sonata.media.provider.image
- sonata.media.provider.file
formats:
width_300: { width: 300, quality: 70 }

Com essas configurações, a imagem será exibida com uma largura de 300 pixels.