Symfony 6:嵌入式表单集合,在子表单中上载文件

neekobn8  于 2023-01-13  发布在  其他
关注(0)|答案(1)|浏览(115)

我有一个实体ClientFileAction,它是OneToMany关系中的实体Attachment的父实体。Attachment不仅包含文件路径,还包含有关文件的信息,如标题,上传日期等。
Attachment:

#[ORM\Column(type: 'string', length: 255)]
private $title;
#[ORM\Column(type: 'datetime')]
private $uploaded;
#[ORM\Column(type: 'string', length: 255)]
private $filePath;

在创建表单类型AttachmentType一对一上传文件时,没有问题:
AttachmentType:

$builder
    ->add('title', null, ['label' => 'Title', 'required' => true])
    ->add('attachmentFile', FileType::class, [
        'label' => 'File',
        'mapped' => false,
        'required' => true,
        'constraints' => [
            new File([
                'maxSize' => '1024k',
            ])
        ],
    ]);

在控制器中,我只是得到上传的文件与$attachmentFile = $form->get('attachmentFile')->getData();,然后继续通常的UploadedFile::move()的东西。

问题:父窗体中嵌入附件类型

但是当我尝试上传多个附件(不仅仅是文件,还有带有标题字段的附件)时,上传的文件字段似乎无法到达。
ClientFileActionType:

$builder
    ->add('description', null, ['label' => 'Description', 'required' => true])
    ->add('attachments', CollectionType::class, ['label' => false,
                                            'allow_add' => true,
                                            'by_reference' => false,
                                            'entry_type' => AttachmentType::class,
                                            'entry_options' => ['label' => false],
                                    ]);

当我将AttachmentType作为 Collection 嵌入到ClientFileActionType中时,在控制器中我找不到获取上传文件的方法:

$attachments = $form->get('attachments')->getData();

$attachmentsAttachment的数组,由于attachmentFile不是Map字段,因此在$form->handleRequest($request);上消失。
我需要一种方法来获取子窗体的未MapattachmentFile字段,类似于:

$attachmentFiles = $form->get('attachments.attachmentFile')->getData();

这会抛出一个错误。有正确的方法吗?

fnvucqvd

fnvucqvd1#

我在打问题的时候找到了正确的方法。
上载的文件位于Request对象中,因此此文件上载管理方案的正确方法可能是:

if ($form->isSubmitted() && $form->isValid())
{
    $i=0;
    $files = $request->files->all('client_file_action')['attachments'];

    foreach ($files as $file)
    {
        $attachmentFile = $file['attachmentFile'];

        $originalFilename = pathinfo($attachmentFile->getClientOriginalName(), PATHINFO_FILENAME);
        
        $safeFilename = $slugger->slug($originalFilename);
        $newFilename = $safeFilename.'-' . uniqid() . '.' .$attachmentFile->guessExtension();

        $attachmentFile->move('path/to/folder',$newFilename);

        $attachment = $clientFileAction->findAttachment($i);

        if ($attachment != null)
            $attachment->setFilePath('path/to/folder/' . $newFilename);

        $i++;
    }
    $clientFileActionRepository->add($clientFileAction, true);
}

相关问题