You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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()]);
}

说明

  1. 每个skuFormItem对应表单中的一个Sku条目,不管是初始加载还是动态新增的条目都可以通过这种方式遍历到
  2. 非映射字段的值不会同步到实体,必须从对应子表单中调用get('字段名')->getData()获取
  3. 加instanceof UploadedFile判断是为了兼容用户没有上传对应图片的场景,避免报错

内容的提问来源于stack exchange,提问作者thomasLdev

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 23:36:05