如何在Symfony 2中向提交的表单添加额外数据?

时间:2014-04-10 05:09:50

标签: php symfony

我有一个只上传图片的简单表单。但是,在我的数据库中,我想从该图像中提取并记录一些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?
    }

}

1 个答案:

答案 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()}},它就不会出现,但这不是那么干净......