uploader un fichier avec symfony 3
Bonjour,
Je veux uploader un fichier avec smyfony 3, j'ai suivie la documentation mais il y a impossible de supprimer le fichier dans le répertoire web lalors qu'il est bien supprimé dans doctrine .
Je décide donc de passer par créer un service et en utilisant un Listener Doctrine. Cependant j'ai une erreur simple à comprendre mais que je n'arrive pas à resoudre :
ClassNotFoundException in appDevDebugProjectContainer.php line 340:
Attempted to load class "BrochureUploadListener" from namespace "Oxy\EmploiBundle\EventListener".
Did you forget a "use" statement for another namespace?
mon service.yml
Code:
1 2 3 4 5 6 7 8 9 10 11
|
app.brochure_uploader:
class: Oxyjob\EmploiBundle\FileUploader
arguments: ['%brochures_directory%']
app.doctrine_brochure_listener:
class: Oxyjob\EmploiBundle\EventListener\BrochureUploadListener
arguments: ['@app.brochure_uploader']
tags:
- { name: doctrine.event_listener, event: prePersist }
- { name: doctrine.event_listener, event: preUpdate } |
config.yml
Code:
1 2 3 4
|
parameters:
locale: fr
brochures_directory: '%kernel.root_dir%/../web/uploads/brochures' |
EventListener.php ajouté à la racine de EmploiBundle
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61
|
<?php
// src/AppBundle/EventListener/BrochureUploadListener.php
namespace Oxy\EmploiBundle\EventListener;
use Symfony\Component\HttpFoundation\File\UploadedFile;
use Doctrine\ORM\Event\LifecycleEventArgs;
use Doctrine\ORM\Event\PreUpdateEventArgs;
use Oxy\EmploiBundle\Entity\document;
use Oxy\EmploiBundle\FileUploader;
use Symfony\Component\HttpFoundation\File\File;
class BrochureUploadListener
{
private $uploader;
public function __construct(FileUploader $uploader)
{
$this->uploader = $uploader;
}
public function prePersist(LifecycleEventArgs $args)
{
$entity = $args->getEntity();
$this->uploadFile($entity);
}
public function preUpdate(PreUpdateEventArgs $args)
{
$entity = $args->getEntity();
$this->uploadFile($entity);
}
private function uploadFile($entity)
{
// upload only works for Product entities
if (!$entity instanceof document) {
return;
}
$file = $entity->getDocument();
// only upload new files
if (!$file instanceof UploadedFile) {
return;
}
$fileName = $this->uploader->upload($file);
$entity->setDocument($fileName);
}
public function postLoad(LifecycleEventArgs $args)
{
$entity = $args->getEntity();
$fileName = $entity->getBrochure();
$entity->setBrochure(new File($this->targetPath.'/'.$fileName));
}
} |
FileUploader.php racine de EmploiBundle
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
|
<?php
namespace Oxy\EmploiBundle;
use Symfony\Component\HttpFoundation\File\UploadedFile;
class FileUploader {
private $targetDir;
public function __construct($targetDir)
{
$this->targetDir = $targetDir;
}
public function upload(UploadedFile $file)
{
$fileName = md5(uniqid()).'.'.$file->guessExtension();
$file->move($this->targetDir, $fileName);
return $fileName;
}
} |
Entité document
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85
|
<?php
namespace Oxy\EmploiBundle\Entity;
use FOS\UserBundle\Model\User as BaseUser;
use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Validator\Constraints as Assert;
/**
* document
*
* @ORM\Table()
* @ORM\Entity(repositoryClass="Oxy\EmploiBundle\Repository\documentRepository")
* @ORM\HasLifecycleCallbacks
*/
class document
{
/**
* @var int
*/
private $id;
/**
* @ORM\ManyToOne(targetEntity="Oxyj\UserBundle\Entity\Utilisateurs", cascade={"persist", "remove"})
* @ORM\JoinColumn(nullable=true)
*/
private $utilisateur;
/**
* @ORM\Column(type="string")
*
* @Assert\NotBlank(message="Please, upload the product brochure as a PDF file.")
* @Assert\File(mimeTypes={ "application/pdf" })
*/
public $document;
public function __toString() {
return $this->curriculumVitae;
}
/**
* @return int
*/
public function getId() {
return $this->id;
}
/**
* @param int $id
*/
public function setId($id) {
$this->id = $id;
}
/**
* @return mixed
*/
public function getUtilisateur() {
return $this->utilisateur;
}
/**
* @param mixed $utilisateur
*/
public function setUtilisateur($utilisateur) {
$this->utilisateur = $utilisateur;
}
/**
* @return mixed
*/
public function getDocument() {
return $this->document;
}
/**
* @param mixed $document
*/
public function setDocument($document) {
$this->document = $document;
}
} |
J'ai suivi la doc :
http://symfony.com/doc/current/contr...load_file.html
Apparemment il manque un Use mais aucun ne fonctionne ...j'ai du louper quelques choses.
Impossible du coup de supprimer le cache. En le supprimant manuellement , cela ne resoud pas le problème.
Merci d'avance
Laurent