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
config.yml
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 }
EventListener.php ajouté à la racine de EmploiBundle
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4parameters: locale: fr brochures_directory: '%kernel.root_dir%/../web/uploads/brochures'
FileUploader.php racine de EmploiBundle
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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)); } }
Entité document
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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; } }
J'ai suivi la doc :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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; } }
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
Partager