Ce bundle de Symfony permet de gérer la partie sélection d’un fichier, upload sur le serveur et enregistrement en base de données.
L’ajout du bundle dans le projet Symfony se réalise via cette commande :
composer require vich/uploader-bundle
Ensuite il est nécessaire de configurer ce bundle en allant modifier le fichier /config/packages/vich_uploader.yaml. Voici un exemple de configuration type que nous mettons en place avec stockage des fichiers uploader dans le répertoire /public/uploads du serveur (https://github.com/dustin10/VichUploaderBundle/blob/master/docs/usage.md) :
vich_uploder:
db_driver: orm
mappins:
images_generique:
uri_prefix: /uploads
upload_destination: '%kernel.project_dir%/public/uploads'
namer: Vich\UploaderBundle\Naming\SmartUniqueNamer
delete_on_remove: true
Il est nécessaire dans les objets Entity de configurer l’utilisation de VichUploader en mettant en début de fichier cette annotation : @Vich\Uploadable
en utilisant cet import use Vich\UploaderBundle\Mapping\Annotation as Vich;
Et au niveau des variables, il sera nécessaire d’en définir une permettant de stocker le chemin du fichier uploader (ici ‘logo’) sur le serveur et une autre variable changeant le fichier (ici ‘logo_file’) :
/** * @ORM\Column(type="string", length=255, nullable=true) */ private $logo; /** * @Vich\UploadableField(mapping="images_generique", fileNameProperty="logo") * @var File|null */ private $logo_file;
Il faudra également définir un champ
updatedAt
qui permettra l’update des fichiers en base de données. Sans cette colonne l’update du fichier ‘logo’ sera impossible (c’est une contrainte technique imposée par VichUploader : https://github.com/dustin10/VichUploaderBundle/blob/master/docs/known_issues.md)/** * @ORM\Column(type="datetime", nullable=true) * * @var \DateTimeInterface|null */ private $updatedAt;
Et enfin la définition des getters / setters :
public function setLogoFile(File $logo = null) { $this->logo_file = $logo; if ($logo) { $this->updatedAt = new \DateTime('now'); } } public function getLogoFile() { return $this->logo_file; } public function setUpdatedAt(?\DateTimeInterface $updatedAt) { $this->updatedAt = $updatedAt; } public function getUpdatedAt(): ?\DateTimeInterface { return $this->updatedAt; }
Maintenant nous pouvons utiliser ce système dans un FormBuilder
ainsi (https://github.com/dustin10/VichUploaderBundle/blob/master/docs/form/vich_image_type.md) :
->add('logo_file', VichImageType::class, [
'label' => 'Logo de l\'évènement',
'required' => false,
'allow_delete' => true,
'delete_label' => 'Supprimer l\'image',
'download_label' => true,
Le paramètre
download_label
à true permet l’affichage en thumbnail de l’image.
La documentation officielle se trouve ici :
https://github.com/dustin10/VichUploaderBundle/tree/master/docs