我按照这个文件https://symfony.com/doc/current/controller/upload_file.html列出的步骤,以允许一个文件被上传。它可以正常使用添加一个新的项目,但是当我尝试编辑我的实体,我发现了以下错误:
表单的视图数据有望成为一流的Symfony \分量\ HttpFoundation的\文件\文件的实例,但它是一个(n)的字符串。您可以通过设置“data_class”选项设置为空或通过添加一个转换(n)的字符串的Symfony \分量\ HttpFoundation的实例\文件\文件视图变压器避免这个错误。
我试着像什么建议文章中追加该文件夹的文件类型,像这样在我的更新方法的实体的路径代码:
public function editAction(Request $request, Advertiser $advertiser)
{
$advertiser->setLogo(
new File($this->getParameter('logo_directory') .'/' . $advertiser->getLogo())
);
$editForm = $this->createForm(AdvertiserType::class, $advertiser);
$editForm->handleRequest($request);
if ($editForm->isSubmitted() && $editForm->isValid()) {
$this->getDoctrine()->getManager()->flush();
return $this->redirectToRoute('advertiser_list');
}
return $this->render('advertiser/index.html.twig', [
'form' => $editForm->createView()
]);
}
该logo_directory参数正确定义(和工作的罚款创造新的实体)。
请告知,如果你有什么我做错了任何想法,我知道。
谢谢您的帮助。
更新:在这篇文章中The form's view data is expected to be an instance of class ... but is a(n) string有一个建议的解决方案在下面的表单生成代码,包括:
->add('file', FileType::class, array('data_class' => null))
所以,我现在这样做的,编辑表单将显示 - 但它不会与先前的选择prepoulate。
->add('logo', FileType::class, array('data_class' => null), ['label' => 'Logo (JPG or PNG file)'])
这是如何有什么想法可以改变,使形式与之前的选秀节目预先填入?
设置一个空data_class
将删除警告,但它不会工作,你不需要它在这一点上。
这是由于这样的事实,一旦你的文件被持久化,什么留在你的数据库只是一个路径,而不是文件本身(这是在磁盘上);
如果您想再次编辑这个实体,路径(字符串)必须转化为再次文件实体;这是错误信息说什么。
..这是你做了什么,当你写的:
$advertiser->setLogo(
new File($this->getParameter('logo_directory') .'/' . $advertiser->getLogo())
);
现在,剩下的问题是,你要预填充文件字段。事实上,这是不可能的,因为文件字段指向一个位置,在自己的电脑,而不是你的服务器上的文件(你不能自动上传从别人的电脑类似的东西,那将是非常危险的)。
你想要做什么可能是预示着文件已经存储,得到它的路径,也许它显示给用户。
因此,在你的嫩枝模板,这样的事情(与你的实际标识目录更改):
{% if form.logo.vars.data %}
<img src="{{ asset('/uploads/logos_directory/' ~ form.logo.vars.data.filename) }}"/>
{% endif %}
希望这是明确的。