我有一个表单类型,用于制作可重复使用的表单以上传文件。它与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')
;
}
似乎保存的路径无法映射到表单,我的工作是有两种表单类型用于上传和创建,但这似乎并不像正确的做法。
最好的方法是什么?
答案 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服务中