2016-06-22 6 views
0

Ich habe erfolgreich einen Dienst und einen Listener zum automatischen Speichern von Dateien in meiner Post-Entität erstellt.Speichern verschiedener Dateitypen über einen Dienst in Symfony2

Alles funktioniert OK, außer ich muss ein anderes Feld zu der Post-Entität hinzufügen: 'Foto'. Was ist der richtige Weg, um so viel wie möglich des folgenden Codes zu erreichen? Ich habe versucht, einige Parameter für den Hörer zu übergeben, aber ich konnte es Arbeit bekommen ...

Broschüren gespeichert unter sollten: web/uploads/Broschüren und Fotos unter: web/uploads/Fotos.

Der Benutzer muss sowohl die Broschüre als auch ein Foto zur Verfügung stellen.

Vielen Dank für die Hilfe.

services.yml:

# brochure uploader service 
app.brochure_uploader: 
    class: AppBundle\Utils\FileUploader 
    arguments: [ '%brochures_directory%' ] 

# uploaded files for Post entity 
app.doctrine_brochure_listener: 
    class: AppBundle\EventListener\BrochureUploadListener 
    arguments: [ '@app.brochure_uploader' ] 
    tags: 
     - { name: doctrine.event_listener, event: prePersist } 
     - { name: doctrine.event_listener, event: preUpdate }  

Utils/FileUploader.php:

namespace AppBundle\Utils; 

use Symfony\Component\HttpFoundation\File\UploadedFile; 

class FileUploader 
{ 
    private $targetDir; 

    public function __construct($targetDir) 
    { 
     $this->targetDir = $targetDir; 
    } 

    public function upload(UploadedFile $file = null) 
    { 
     $fileName = md5(uniqid()).'.'.$file->guessExtension(); 
     $file->move($this->targetDir, $fileName); 

     return $fileName; 
    } 

    public function getTargetDir() { 
     return $this->targetDir; 
    } 
} 

EventLister/BrochureUploadListener.php:

Klasse BrochureUploadListener { privater $ 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) 
{ 
    if (!$entity instanceof Post) { 
     return; 
    } 

    $file = $entity->getBrochure(); 

    if (!$file instanceof UploadedFile) { 
     return; 
    } 

    $fileName = $this->uploader->upload($file); 
    $entity->setBrochure($fileName); 
} 

}

Form/PostType.php:

public function buildForm(FormBuilderInterface $builder, array $options) 
{ 
    $builder 
     [...] 
     ->add('brochure', 'Symfony\Component\Form\Extension\Core\Type\FileType', array(
      'label' => 'Brochure (PDF file)', 
      'data_class' => null, 
     )) 
     [...] 
    ; 
} 

Entity/post.php

/** 
* @ORM\Column(type="string") 
* 
* @Assert\File(mimeTypes={ "application/pdf" }) 
*/ 
private $brochure; 

Antwort

0

Sie neu erfinden das Rad nicht. Verwenden Sie VichUploaderBundle (auch von offiziellen Symfony-Dokumentation vorgeschlagen) und leben glücklich

+1

Vielen Dank für die Eingabe, ich werde dieses Bundle versuchen. Ich möchte Symfony auch etwas besser kennenlernen, das ist der Grund für diese Frage :) – Torpedr

Verwandte Themen