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