首页 > 解决方案 > 作为表单的一部分上传的文件不是 Symfony 4 中请求的一部分

问题描述

我创建的表单包含一个用于上传文件的上传字段。该文件可以是任何格式。表单本身是在 FormType 内部创建的,并且控制器会成功处理表单的提交。但是,每次我将表单提交到此控制器并执行print_rorvar_dump()时,上传字段都不包含在 POST 请求的参数中。当我使用它时$file = $request->files->get('estimateUpload');var_dump()它只会返回NULL

这是我正在使用的表单类型:

<?php

namespace App\Form;

use App\Entity\IhcVehicleDamageMatrix;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\Extension\Core\Type\FileType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;
use Symfony\Component\Validator\Constraints\File;

class IhcVehicleDamageEntryType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('id')
            ->add('incidentId')
            ->add('vehicleDamageId')
            ->add('damageType')
            ->add('description')
            ->add('wheelTyreDamage')
            ->add('tyreAge')
            ->add('tyreDotCode')
            ->add('treadDepth')
            ->add('renumerationCost')
            ->add('itemAge')
            ->add('created')
            ->add('modified')
            ->add('estimateUpload', FileType::class, [
                'required' => false
            ])
        ;
    }

    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults([
            'data_class' => IhcVehicleDamageMatrix::class,
        ]);
    }
}

在视图文件中,这是我使用上传字段的方式:

{{ form_start(damageForm, {'action': path('forms_ihc_damage_details_submitform'), 'method': 'POST', 'attr': {'id': 'ihcFormDamageDetails', 'enctype': 'multipart/form-data'}}) }}
{{ form_row(damageForm._token) }}
                    <tr>
                        <th>Upload Estimate</th>
                        <td>
                            {{ form_widget(damageForm.estimateUpload) }}
                            <small>{{ form_help(damageForm.estimateUpload) }}</small>
                            <div class="form-error">
                                {{ form_errors(damageForm.estimateUpload) }}
                            </div>
                        </td>
                    </tr>
{{ form_errors(damageForm) }}
{{ form_end(damageForm, {'render_rest': false}) }}

在控制器中,这就是我获取表单数据的方式:

    public function vehicleDamageForm(Request $request)
    {
        // Get Form Details
        $formdet = $request->get('ihc_vehicle_damage_entry');

        $em = $this->getDoctrine()->getManager();

        $file = $request->files->get('estimateUpload');
        var_dump($file);
}

标签: symfonysymfony4

解决方案


更好的方法是estimateUpload直接从IhcVehicleDamageMatrix. 在控制器内部尝试这样的事情:

$ihcVehicleDamageMatrix = new IhcVehicleDamageMatrix();

$form = $this->createForm(IhcVehicleDamageEntryType::class, $ihcVehicleDamageMatrix);

if ($form->isSubmitted() && $form->isValid()) {
    $file = $ihcVehicleDamageMatrix->estimateUpload();
    dump($file);
}

推荐阅读