我有一个只上传图片的简单表单。但是,在我的数据库中,我想从该图像中提取并记录一些EXIF数据。
我不确定在Symfony2中使用什么。它似乎不是在实体中计算这些额外信息的正确位置。我还能把它放在哪里呢?
<?php
namespace Timeline\DefaultBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Validator\Constraints as Assert;
use Symfony\Component\HttpFoundation\File\UploadedFile;
/**
* @ORM\Entity
* @ORM\HasLifecycleCallbacks
*/
class Document
{
//...
/**
* @ORM\PrePersist()
* @ORM\PreUpdate()
*/
public function preUpload()
{
// extract EXIF here?
}
}
答案 0 :(得分:3)
只要您不需要修改另一个实体,Doctrine事件就可以很好地工作。
我认为处理案例的最佳方法是使用表单事件。 http://symfony.com/doc/current/cookbook/form/dynamic_form_modification.html#cookbook-form-events-user-data
例如,您可以使用POST_SUBMIT事件,并动态添加'exif'文本字段,并在您的实体上添加映射数据库字段的$ exif属性。
class Document
{
/**
* @ORM\Column(type="text")
*/
private $exif;
}
class DocumentType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('file', 'file')
;
$builder->addEventListener(
FormEvents::PRE_SUBMIT,
function (FormEvent $event) {
$form = $event->getForm();
$data = $event->getData();
$data['exif'] = 'data';
$event->setData($data);
$form->remove('exif');
$form->add('exif', 'string');
}
);
}
}
编辑#1: 经过进一步的研究,我发现的唯一方法是在数据数组中定义'exif'键,在表单中定义'exif'字段,这样它就能将它映射到你的实体。 提交后我没有找到解决表单中剩余'exif'字段问题的方法。如果你把它定义为隐藏,或者不使用{{form_rest()}},它就不会出现,但这不是那么干净......