我已经成功创建了一个服务和一个侦听器,可以自动将文件保存在我的帖子实体中。
一切正常,除了我需要在帖子实体中添加另一个字段:'photo'。使用以下代码尽可能多的代码的正确方法是什么?我试图将一些参数传递给听众,但我可以使它起作用...
应保存小册子: Web/uploads/hobhures 和照片下: web/uploads/photos 。
用户必须同时提供小册子和照片。
感谢您的所有帮助。
services.yml:
# brochure uploader service
app.brochure_uploader:
class: AppBundleUtilsFileUploader
arguments: [ '%brochures_directory%' ]
# uploaded files for Post entity
app.doctrine_brochure_listener:
class: AppBundleEventListenerBrochureUploadListener
arguments: [ '@app.brochure_uploader' ]
tags:
- { name: doctrine.event_listener, event: prePersist }
- { name: doctrine.event_listener, event: preUpdate }
utils/fileuploader.php:
namespace AppBundleUtils;
use SymfonyComponentHttpFoundationFileUploadedFile;
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:
类brochureuploploadlistener{ 私人$ 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);
}
}
form/postType.php:
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
[...]
->add('brochure', 'SymfonyComponentFormExtensionCoreTypeFileType', array(
'label' => 'Brochure (PDF file)',
'data_class' => null,
))
[...]
;
}
entity/post.php
/**
* @ORMColumn(type="string")
*
* @AssertFile(mimeTypes={ "application/pdf" })
*/
private $brochure;
不要重新发明轮子。使用Vichuploaderbundle(也由官方Symfony文档提出)并Live Happy