2016-06-22 22 views
0

我已經成功創建了服務和偵聽器,以自動將文件保存在我的發佈實體中。通過Symfony2中的服務保存不同類型的文件

一切工作正常,除了我需要添加另一個字段到郵政實體:'照片'。使用盡可能多的以下代碼來完成該操作的正確方法是什麼?我想一些參數傳遞給聽衆,但我能得到它的工作...

說明書應下保存:網/上傳/小冊子和照片下:網/上傳/照片

用戶必須提供小冊子和照片。

謝謝你的幫助。

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:

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

    $file = $entity->getBrochure(); 

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

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

}

表/ 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, 
     )) 
     [...] 
    ; 
} 

實體/ post.php中

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

回答

0

不要推倒重來。 使用VichUploaderBundle(也由官方Symfony文檔建議)和現場開心

+1

謝謝你的輸入,我打算試試這個Bundle。我也想更好地瞭解Symfony,這就是這個問題的原因:) – Torpedr

相關問題