使用上载文件重用Symfony2表单类型进行更新和创建

时间:2015-02-19 19:22:28

标签: forms symfony

我有一个表单类型,用于制作可重复使用的表单以上传文件。它与Gaufrette和Amazon S3集成在一起,就像一个魅力。我想重复使用相同的表单类型进行编辑/更新。

我为编辑创建了路由,回调等。当我重用相同的表单类型时,它会打破映射:

  

表单的视图数据应该是Symfony \ Component \ HttpFoundation \ File \ File类的实例,但是是(n)字符串。您可以通过设置" data_class"来避免此错误。 null选项或添加视图转换器,将(n)字符串转换为Symfony \ Component \ HttpFoundation \ File \ File的实例。

当我将映射设置为false时,表单适用于更新,但不适用于初始创建。

public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder
        ->add('name')
        ->add('path', 'file', array('mapped' => false))
        ->add('report')
    ;
}

似乎保存的路径无法映射到表单,我的工作是有两种表单类型用于上传和创建,但这似乎并不像正确的做法。

最好的方法是什么?

1 个答案:

答案 0 :(得分:0)

关于此主题的symfony cookbock主张在实体上使用两个单独的字段。一个是路径,另一个是文件(实际上是UploadedFile类型)。

所以它是 by the book ,非常好。

文件字段未被保留(这意味着它不在Entity.orm.yml中,或者具有@ORM Annotations)。在您的控制器处理完请求之后,您将在实体上调用上传函数(这是错误的代码设计*),该函数将文件从例如/ tmp / php到应用程序的Web文件夹,并分别更新实体的路径属性。

Snippet(更新或创建控制器的操作):

$form = $this->createCreateForm($entity);
$form->handleRequest($request);
if($form->isValid()) {
    if( null !== $entity->getFile() ) {
        $entity->upload();
    }
    $em->persist($entity);//Only when in createAction
    $em->flush();
}

无论你是否使用学说,你都会得到这样的想法: http://symfony.com/doc/current/cookbook/doctrine/file_uploads.html

*您应该将该逻辑提取到单独的symfony服务中