(16) 981791110 contato@policast.studio

O que é o VichUploaderBundle?

O VichUploaderBundle é uma biblioteca de upload de arquivos em Symfony. Ele fornece uma implementação fácil e simplificada de várias funcionalidades que precisam ser implementadas para lidar com upload de arquivos em um aplicativo Symfony.

Além disso, o VichUploaderBundle permite adicionar funcionalidades ao Entity Doctrine que permitem o upload de arquivos para essa entidade e, em seguida, recuperar esses arquivos no aplicativo.

O objetivo do VichUploaderBundle é tornar o upload de arquivos o mais fácil e eficiente possível dentro do ecossistema Symfony.

Como instalar o VichUploaderBundle?

Para instalar o VichUploaderBundle, execute o seguinte comando em seu terminal:

composer require vich/uploader-bundle

Depois, adicione o seguinte código ao seu arquivo `config/bundles.php`:

VichUploaderBundleVichUploaderBundle::class => ['all' => true],

Como usar o VichUploaderBundle?

Para usar o VichUploaderBundle, primeiro defina uma entidade Doctrine que possua o campo `file` (ou outro campo de sua escolha, com sua especificação adequada):

use VichUploaderBundleMappingAnnotation as Vich;

/**
* @VichUploadable
*/
class MyEntity
{
/**
* @VichUploadableField(mapping="my_file_mapping", fileNameProperty="filePath")
*/
private $file;
private $filePath;
}

Em seguida, crie um formulário para sua entidade:

public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder->add('file', FileType::class);
}

Ao enviar este formulário, o arquivo será automaticamente enviado para o diretório configurado em sua aplicação Symfony (consulte “Como configurar o VichUploaderBundle?” abaixo para saber como configurar essa funcionalidade).

Como configurar o VichUploaderBundle?

Para configurar o VichUploaderBundle, adicione a seguinte configuração ao seu arquivo `config.yml`:

vich_uploader:
db_driver: orm
mappings:
my_file_mapping:
uri_prefix: /uploads/files
upload_destination: '%kernel.project_dir%/public/uploads/files'

Aqui, você pode especificar o caminho absoluto para onde os arquivos devem ser enviados e prefixo URI a ser usado para acessar esses arquivos.

Como recuperar os arquivos enviados com o VichUploaderBundle?

Para recuperar os arquivos enviados com o VichUploaderBundle, você pode chamar o método `getFilePath()` em sua entidade Doctrine:

$myEntity->getFilePath();

Você também pode usar diretamente a URL do arquivo, com o prefixo URI definido na configuração VichUploaderBundle:

{{ asset(myEntity.filePath) }}

Como renomear o arquivo enviado com o VichUploaderBundle?

Para renomear o arquivo enviado com o VichUploaderBundle, você pode configurar um objeto NameTransformónoes no arquivo de configuração:

vich_uploader:
db_driver: orm
mappings:
my_file_mapping:
uri_prefix: /uploads/files
upload_destination: '%kernel.project_dir%/public/uploads/files'
namer: AppServiceFileNamer

Aqui definimos um serviço chamado `AppServiceFileNamer` para nomear o arquivo. Este serviço deve implementar o método `name()`:

use VichUploaderBundleNamingNamerInterface;

class FileNamer implements NamerInterface
{
public function name($object, PropertyMapping $mapping): string
{
return sprintf('%s.%s', sha1(uniqid()), $mapping->getFile($object)->guessExtension());
}
}

Como validar o upload de arquivo no VichUploaderBundle?

Para validar o upload de arquivo no VichUploaderBundle, você pode usar as restrições de validação Symfony padrão:

use SymfonyComponentValidatorConstraints as Assert;

class MyEntity
{
/**
* @VichUploadableField(mapping="my_file_mapping", fileNameProperty="filePath")
* @AssertNotNull()
* @AssertFile(mimeTypes={"image/png"})
*/
private $file;
private $filePath;
}

Aqui, adicionamos dois validadores: `@AssertNotNull()` para garantir que o arquivo tenha sido fornecido e `@AssertFile(mimeTypes={“image/png”})` para garantir que o arquivo seja do tipo MIME image/png.

Como criar uma extensão Twig para usar com o VichUploaderBundle?

Para criar uma extensão Twig para usar com o VichUploaderBundle, crie a seguinte classe:

use TwigExtensionAbstractExtension;
use TwigTwigFilter;
use TwigTwigFunction;

class VichUploaderExtension extends AbstractExtension
{
public function getFilters()
{
return [
new TwigFilter('vich_file', [$this, 'vichFileFilter']),
];
}

    public function vichFileFilter($entity)
{
return asset($entity->getFilePath());
}
}

Aqui, criamos um filtro Twig chamado `vich_file` que recebe uma entidade Doctrine e recupera a URL do arquivo usando o método `getFilePath()`. Em seguida, podemos usar este filtro em nossos modelos Twig:

{{ myEntity|vich_file }}

Como estender o controle de versão de arquivos com o VichUploaderBundle?

Para estender o controle de versão de arquivos com o VichUploaderBundle, você pode configurar uma estratégia de nomenclatura baseada em hash:

vich_uploader:
db_driver: orm
mappings:
my_file_mapping:
uri_prefix: /uploads/files
upload_destination: '%kernel.project_dir%/public/uploads/files'
namer: VichUploaderBundleNamingUniqidNamer
directory_namer: VichUploaderBundleNamingHashDirectoryNamer

Aqui, estamos usando `UniqidNamer` para gerar um nome de arquivo exclusivo e `HashDirectoryNamer` para gerar um nome de diretório exclusivo.

Como redimensionar imagens com o VichUploaderBundle?

Para redimensionar imagens com o VichUploaderBundle, você pode usar a funcionalidade EasyAdmin:

easy_admin:
entities:
MyEntity:
class: AppEntityMyEntity
form:
fields:
- { property: 'file', type: 'vich_image', options: { allow_delete: false, image_uri_template: '/uploads/files/__image__', download_uri: false } }

Aqui, estamos usando o tipo de campo `vich_image` para redimensionar a imagem enviada. Observe que definimos `allow_delete` como `false` para evitar excluir a imagem original e usamos `image_uri_template` para definir como formatar a URL de exibição da imagem redimensionada.

Como usar o VichUploaderBundle com um serviço de armazenamento externo, como AWS S3?

Para usar o VichUploaderBundle com um serviço de armazenamento externo, como o AWS S3, você precisará instalar a seguinte biblioteca:

composer require league/flysystem-aws-s3-v3:^1.0

Em seguida, configure o VichUploaderBundle para usar o adaptador da biblioteca Flysystem:

vich_uploader:
db_driver: orm
storage: gaufrette
gaufrette:
stream_wrapper: ~
adapters:
my_file_adapter:
aws_s3:
client:
credentials:
key: %env(AWS_ACCESS_KEY_ID)%
secret: %env(AWS_SECRET_ACCESS_KEY)%
region: %env(AWS_REGION)%
version: 'latest'
bucket: my-bucket-name
filesystems:
my_filesystem:
adapter: my_file_adapter

Aqui usamos o adaptador `aws_s3` da biblioteca Flysystem e especificamos nossas credenciais do AWS S3 e região. Em seguida, definimos um sistema de arquivos Gaufrette com o adaptador especificado.

Como restringir o tamanho do arquivo enviado com o VichUploaderBundle?

Para restringir o tamanho do arquivo enviado com o VichUploaderBundle, defina a opção `maxSize` no seu formulário:

public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder->add('file', FileType::class, [
'constraints' => [
new File([
'maxSize' => '500k',
]),
],
]);
}

Aqui estamos restringindo o tamanho do arquivo a 500 KB.