首页 > 解决方案 > Symfony 动态表单 - 从嵌入式表单获取文件给出 NULL

问题描述

我有一个动态表单,它FileType根据另一个字段值(链接)显示/隐藏一个字段。当我试图在我的控制器中获取文件时,它总是给我NULL

我的用户类型:

    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('familyStatus', ChoiceType::class, [
                'label' => 'Statut de famille',
                'label_attr' => [
                    'class' => 'fg-label'
                ],
                'attr' => [
                    'class' => 'sc-gqjmRU fQXahQ'
                ],
                'required' => true,
                'choices' => [
                    'Married' => 'M',
                    'Single' => 'S'
                ]
            ]);

        $formModifier = function (FormInterface $form, $status = null) {
            if ($status === 'M') {
                $form->add('familyInfo', FamilyInfoType::class);
            }
        };

        $builder->addEventListener(
            FormEvents::PRE_SET_DATA,
            function (FormEvent $event) use ($formModifier) {
                $user = $event->getData();
                $formModifier($event->getForm(), $user->getFamilyStatus());
            }
        );

        $builder->get('familyStatus')->addEventListener(
            FormEvents::POST_SUBMIT,
            function (FormEvent $event) use ($formModifier) {
                $status = $event->getForm()->getData();
                $formModifier($event->getForm()->getParent(), $status);
            }
        );

    }

我的家庭信息类型:

    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('partnerName', TextType::class, [
                'label' => 'Nom du partenaire',
                'label_attr' => [
                    'class' => 'fg-label'
                ],
                'attr' => [
                    'class' => 'sc-gqjmRU fQXahQ'
                ],
                'required' => true
            ])
            ->add('weddingProof', FileType::class, [
                'label' => 'Acte de mariage',
                'label_attr' => [
                    'class' => 'Upload-label'
                ],
                'attr' => [
                    'class' => 'Upload-input',
                    'maxsize'     =>'4M',
                    'accept'      =>'image/*'
                ],
                'required' => false,
                'mapped' => false
            ]);
    }

我的用户控制器:

    /**
     * @Route("/user", name="add_user", methods={"GET", "POST"})
     * @param Request $request
     */
    public function addUser(Request $request) {
        $response = [];

        $user = new User();
        $form = $this->createForm(UserType::class, $user);
        $form->handleRequest($request);

        if ($form->isSubmitted() && $form->isValid()) {
            if ($user->getFamilyStatus() === 'M') {
                var_dump("ok");

                $document = $form->get('familyInfo')->get('weddingProof')->getData();
                $partnerName = $form->get('familyInfo')->get('partnerName')->getData();

                var_dump($document); // NULL
                var_dump($partnerName); // OK the value is displayed
                die;
            }
        }

        return $this->render("user/registration.html.twig", ['form' => $form->createView()]);
   }

它适用于TextTypefield 但不适用于FileType. 我的表格有什么问题。

标签: symfony

解决方案


问题在于文件类型的 mapped => false 选项。该表单未在您的实体属性中设置上传的文件对象,因为它未映射。


推荐阅读