5

基本的な Symfony 3 アプリケーションには、VichUploader バンドルがインストールおよび構成されており、ファイルをアップロードするためのエンティティがあります。

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


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 namer を使用していないため、ファイル名が間違っています
  • おそらくサービスとして、どこかに住むべきですか?
4

1 に答える 1

0

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;
    }
}

これにより、ファイル、パス、および名前を指定できます。

次に app/config/service.yml ファイルに、これを追加して参照します。

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

次に、app/config/parameters.yml ファイルで %document_directory% を指定する必要があります。

parameters:
...
    document_directory: documents

私の場合、上記の「documents」フォルダーは web フォルダーの下にあるため、パスは「web/documents」です。すべてを同じ場所に保管したかったのです。

次に、次のように任意のコントローラーで FileUploader を使用します。

...
->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();

上記のコードでは、ファイルである「カタログ」ファイル ボタン データを取得しています。次に、ファイルとパスとファイル名のパラメーターを指定して「アップロード」メソッドを呼び出します。その後、エンティティ ($att_cat) を永続化します。

上記の使い方はとても簡単です。

于 2016-08-04T17:10:14.500 に答える