奇怪的例外-不允许序列化'Symfony \ Component \ HttpFoundation \ File \ File'

时间:2019-04-12 13:57:23

标签: forms symfony serialization

我有一个例外,这种奇怪的行为我无法理解。我会尽力解释。

我有一个表单,可以在其中添加创建报告。使用者可以上传多个附件pdf和一个文本注释。该表单具有2个提交按钮,即“保存”和“ saveAndClose”。

class ReportType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('documentDatas', CollectionType::class, array(
                'entry_type' => DocumentType::class,
                'entry_options' => ['data_class' => 'AppBundle\Model\DocumentPdfData', 'add_class' => 'upload-pdf'],
                'allow_add' => true,
                'allow_delete' => true,
                'label' => false
            ))
            ->add('comment', CKEditorType::class, array(
                'config' => array('toolbar' => 'my_toolbar'),
                'label' => false,
                'required' => false,
                'input_sync' => true
            ))
            ->add('save', SubmitType::class, array('attr' => array('class' => 'btn btn-success mr-2')))
            ->add('saveAndClose', SubmitType::class, array('label' => 'saveAndClose', 'attr' => array('class' => 'btn btn-success float-right')))
        ;
    }
}

“保存”仅保留表单,saveAndClose显然会关闭报表,因此用户无法再对其进行修改。

例外

  

不允许对“ Symfony \ Component \ HttpFoundation \ File \ File”进行序列化

当用户上传附件并保存并关闭表单时出现。仅在这种情况下,其他情况下才能很好地工作(也可以上传附件,推送保存,返回表单并保存并关闭)。

这是我的控制者:

 if ($form->isSubmitted() && $form->isValid()) {
            if ($form->getClickedButton() && 'saveAndClose' === $form->getClickedButton()->getName()) {

                    $this->get(ConfirmReport::class)->confirm($report, $user);
                    $em->flush();

                    $report->modify($reportData, $user);

                    $em->persist($report->getReportParameters());
                    $em->persist($report);

                    $em->flush();

                    $this->addFlash('success', $this->get('translator')->trans('ReportConfirmed'));
                    return $this->redirectToRoute('practitioner_visit_detail_to_do');

            }

            if ($form->getClickedButton() && 'save' === $form->getClickedButton()->getName()) {
                $report->modify($ReportData, $user);
                $em->persist($report->getReportParameters());
                $em->persist($report);
                $em->flush();

                $this->addFlash('success', $this->get('translator')->trans('ReportSaved'));
                return $this->redirectToRoute('practitioner_visit_detail_to_do');
            }
        }

因此,两个通量之间的唯一区别是confimReport服务。在此内部,我将report的bool参数设置为true并在数据库上进行了一些操作,以删除用户对此报告的某些读取和写入权限。与上传的文件无关。所以,我不明白是什么原因导致异常。

N.B。:

  • 如果我评论confirmReport服务一切正常(不知道为什么);
  • 我获得了异常,但实体管理器已刷新,因此在我的数据库中,我保存了用户的操作(还上传了文件)。

那还有什么可能导致这种情况?

1 个答案:

答案 0 :(得分:0)

也许第二次冲洗弄乱了代码?你可以试试这个吗?

if ($form->isSubmitted() && $form->isValid() && $form->getClickedButton()) {
    if ('saveAndClose' === $form->getClickedButton()->getName()) {
        $this->get(ConfirmReport::class)->confirm($report, $user);
        $msg='ReportConfirmed';
    }

    if ('save' === $form->getClickedButton()->getName()) {
        $msg = 'ReportSaved';
    }

    $report->modify($ReportData, $user);
    $em->persist($report->getReportParameters());
    $em->persist($report);
    $em->flush();

    $this->addFlash('success', $this->get('translator')->trans($msg));
    return $this->redirectToRoute('practitioner_visit_detail_to_do');
}

您还可以显示confirm()函数的内容吗?

谢谢