2016-06-22 12 views
0

Post Entityにファイルを自動的に保存するサービスとリスナーが正常に作成されました。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

ありがとう、私はこのバンドルを試してみます。私はまた、Symfonyを少し良く知りたいのですが、それがこの質問の理由です:) – Torpedr

関連する問題