2016-08-04 5 views
3

基本的なSymfony 3アプリケーションには、ファイルをアップロードするエンティティを持つVichUploader bundleがインストールされ、設定されています。Symfony3のVichUploaderバンドルを使用したデータフィクス

ORMデータフィクスチャでこのエンティティにファイルを添付するにはどうすればよいですか?


question for this problem in Symfony 2があり、そのコードを試しました。フィクスチャはエラーなくロードされますが、「アップロードされた」ファイルは最終的なデスティネーションにコピーされません。

私は手動でこれを行うことができ、私の最新の試みは次のようになります。

<?php 
// src/AppBundle/DataFixtures/ORM/LoadCourseData.php 

namespace AppBundle\DataFixtures\ORM; 

use Doctrine\Common\DataFixtures\OrderedFixtureInterface; 
use Doctrine\Common\DataFixtures\AbstractFixture; 
use Doctrine\Common\Persistence\ObjectManager; 
use Symfony\Component\HttpFoundation\File\UploadedFile; 
use Symfony\Component\HttpFoundation\File\MimeType\MimeTypeGuesser; 
use AppBundle\Entity\Course; 

class LoadCourseData extends AbstractFixture implements OrderedFixtureInterface 
{ 
    public function load(ObjectManager $manager) 
    { 
     $course = new Course(); 
     $course->setName('How to make data fixtures in Symfony lol') 
      ->setAuthor($this->getReference('admin-user')) 
      ->setSummary('You\'ll know when I know!') 
      ->setLicense($this->getReference('cc-by')) 
      ->setDifficulty(1); 

     // Persist to generate slug (to be used for uploads) 
     $manager->persist($course); 

     // Attach file 

     // I copy it to a temporary directory as per the Symfony2 answer 
     copy(__DIR__.'/../Files/kitten.jpg', '/tmp/kitten.jpg'); 

     // These are filled in for completeness 
     $mimetype = MimeTypeGuesser::getInstance()->guess('/tmp/kitten.jpg'); 
     $size  = filesize('/tmp/kitten.jpg'); 

     // Create a new UploadedFile 
     $file = new UploadedFile('/tmp/kitten.jpg', 'kitten.jpg', $mimetype, $size, null, true); 

     // I have to move it manually? 
     // Plus how can I take advantage of the VichUploader namer? 
     $file->move(__DIR__.'/../../../../web/img/upload/course/'); 

     // Apply to entity 
     $course->setImageFile($file); 

     // Persist 
     $manager->persist($course); 
     $manager->flush(); 
    } 

    public function getOrder() 
    { 
     return 4; 
    } 
} 

私のソリューションは、まだ多くの作業を必要としています!私は間違った木を吠えますか?

  • アップロードパスは既にconfig.ymlで定義されています。私はそこからそれらにアクセスしたり、パラメータ
  • にそれらを変換する必要があり
  • ファイルを投げて、より多くのエラーチェックと例外が先にコピーされる必要がありますが、それは
  • 構成されVichUploaderのナメルを使用していないので、ファイル名は、間違っています他の場所、おそらくサービスとして生きるべきでしょうか?

答えて

1

私は非常に良いではないGitHubの上VichUploaderのドキュメントを見つけたので、私はあなたがsymfonyのドキュメントを使用することをお勧め: http://symfony.com/doc/current/controller/upload_file.html

私はそうのようにSRC/AppBundle下FileUploader.phpを作成しました:

<?php 

// src/AppBundle/FileUploader.php 
namespace AppBundle; 

use Symfony\Component\HttpFoundation\File\UploadedFile; 

class FileUploader 
{ 
    private $targetDir; 

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

    public function upload(UploadedFile $file, $path, $name) 
    { 
     $fileName = $name.'.'.$file->guessExtension(); 

     $file->move($this->targetDir.$path, $fileName); 

     return $fileName; 
    } 
} 

ファイル、パス、および名前を指定できます。あなたのアプリ/設定/ service.ymlファイルに続いて

、それを参照するためにこれを追加します。

services: 
    app.attachment_uploader: 
     class: AppBundle\FileUploader 
     arguments: ['%document_directory%'] 

次にアプリ/設定/ parameters.ymlファイルに%のdocument_directoryの%を指定する必要があります。

私の場合、上記の 'documents'フォルダはwebフォルダの下にあるので、パスは 'web/documents'です。私はすべてを同じ場所に保管したかったのです。ファイルで上記のコードでは、私は「カタログ」ファイルボタンデータを取得しています

... 
->add('catalog', FileType::class, array(   // Docs 
     'label' => 'Catalog Course Description ', 
     'required' => false, 
     'attr' => array(
       'accept' => 'image/*,application/pdf,text/plain,application/msword', 
       'onchange' => "checkFileSize('form_catalog')" 
     ), 
)) 
... 

$file = $form->get("catalog")->getData(); 
$fileName = $this->get('app.attachment_uploader')->upload($file, 
     '/'.$pet->getStudent()->getBanId(), 
     $pet->getCourse()->getCorTitle().'_'.'Catalog_Course_Desc' 
... 

$att_cat->setDocument($fileName); 
$em->persist($att_cat); 
$em->flush(); 

、:

それから私はそうのような任意のコントローラでFileUploaderを使用しています。次に、ファイルとパスとファイル名のパラメータを指定して 'upload'メソッドを呼び出します。その後、エンティティ($ att_cat)を永続化します。

上記は非常に使いやすいです。

関連する問題