Symfony 5 控制器中获取CollectionType表单内Sku实体的上传文件对象方法
问题原因
你在SkuType中将两个上传字段设置了mapped: false,所以表单提交后不会自动将上传文件对象映射到Sku实体的属性上,直接遍历实体拿不到对应文件。
解决方案
修改控制器中表单验证通过后的遍历逻辑,改为遍历表单的skus子项,从子表单中获取非映射的上传字段数据,对应关联到Sku实体即可:
// 首先确认你在控制器顶部引入了UploadedFile类 use Symfony\Component\HttpFoundation\File\UploadedFile; // ... 原有代码不变 if ($form->isSubmitted() && $form->isValid()) { // 遍历表单的skus集合子项,而非直接遍历实体集合 foreach ($form->get('skus') as $skuFormItem) { // 获取当前子表单对应的Sku实体 $sku = $skuFormItem->getData(); // 处理第一张图片 $picture1 = $skuFormItem->get('picture_1')->getData(); if ($picture1 instanceof UploadedFile) { $pic1Name = $this->handleUploadedFile($picture1); $sku->setPicture1($pic1Name); } // 处理第二张图片 $picture2 = $skuFormItem->get('picture_2')->getData(); if ($picture2 instanceof UploadedFile) { $pic2Name = $this->handleUploadedFile($picture2); $sku->setPicture2($pic2Name); } // 保留原有逻辑 $sku->setFolder($norlogFolder); $sku->setSKU($norlogFolder->getNorlogReference() . '-' . $sku->getSKU()); } $entityManager->persist($norlogFolder); $entityManager->flush(); return $this->redirectToRoute('folder_edit', ['id' => $norlogFolder->getId()]); }
说明
- 每个
skuFormItem对应表单中的一个Sku条目,不管是初始加载还是动态新增的条目都可以通过这种方式遍历到 - 非映射字段的值不会同步到实体,必须从对应子表单中调用
get('字段名')->getData()获取 - 加
instanceof UploadedFile判断是为了兼容用户没有上传对应图片的场景,避免报错
内容的提问来源于stack exchange,提问作者thomasLdev
相关产品推荐
相关产品推荐

