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

Forms 重新使用Symfony2表单类型更新和创建上载的文件,forms,symfony,Forms,Symfony,我有一个表单类型,用于制作可重用表单以上载文件。它与Gaufrete和Amazon S3集成在一起,工作起来很有魅力。我想重用相同的表单类型进行编辑/更新 我为编辑创建了路由、回调等。当我重用同一表单类型时,它会在映射上中断: 表单的视图数据应为Symfony\Component\HttpFoundation\File\File类的实例,但为(n)字符串。通过将“data_class”选项设置为null或添加一个视图转换器,将(n)字符串转换为Symfony\Component\HttpFoun

我有一个表单类型,用于制作可重用表单以上载文件。它与Gaufrete和Amazon S3集成在一起,工作起来很有魅力。我想重用相同的表单类型进行编辑/更新

我为编辑创建了路由、回调等。当我重用同一表单类型时,它会在映射上中断:

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

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

public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder
        ->add('name')
        ->add('path', 'file', array('mapped' => false))
        ->add('report')
    ;
}
似乎保存的路径无法映射到表单,我的工作是有两种表单类型用于上传和创建,但这似乎不是正确的方法


最好的方法是什么

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

因此,这是按规定的,非常好

文件字段没有被持久化(这意味着它不在Entity.orm.yml中,或者没有@orm注释)。控制器处理请求后,调用实体上的上载函数(这是错误的代码设计*),将文件从/tmp/php移动到应用程序的web文件夹,并分别更新实体的路径属性

代码段(更新或创建控制器的操作):

无论你是否使用教义,你都会得到这个想法:


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

我最初错过了您问题的最后一句话。所以我想我的答案对你没有多大价值,但我会把它留在这里,因为如果有人在谷歌上搜索你发布的错误消息,他可能会对我的答案感兴趣。实体不应该处理文件上传。食谱建议使用条令事件监听器。。。不。它建议使用生命周期回调来调用实体上的方法。我仍然使用两种表单,一种用于编辑,一种用于创建,我认为这是最好的方法。
$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();
}