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