Symfony 5 $form->isSubmitted()对于文件上载返回False

hec6srdp  于 2022-11-16  发布在  其他
关注(0)|答案(2)|浏览(110)

我正在尝试通过我创建的API端点控制器上载文件:

/**
 * @Route("/upload", methods="POST")
 */
public function upload(Request $request)
{
    $form = $this->createForm(UserFileType::class);
    $form->handleRequest($request);

    if (!$form->isSubmitted()) {
        dd($request->files->get('file'));
    }
   ...

dd($request->files->get('file'))按预期显示我的文件,所以我不清楚为什么当方法接收multipart/form-dataPOST请求和数据时,isSubmitted()返回false。我通过Postman提交POST请求。为什么表单没有提交?
用户文件类型:

class UserFileType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('file', FileType::class, [
                'mapped' => false,
                'required' => true,
                'constraints' => [
                    new File([
                        'maxSize' => '2M',
                        'mimeTypes' => [
                            'application/pdf',
                            'application/x-pdf',
                        ],
                        'maxSizeMessage' => 'The file size must not exceed {{ limit }} {{ suffix }}.',
                        'mimeTypesMessage' => 'The file type {{ type }} is not valid',
                    ])
                ],
            ]);
    }
jk9hmnmh

jk9hmnmh1#

对于从AbstractType派生的窗体类,当窗体通过FormFactory生成时,它使用fqcnToBlockPrefix命名。
您可以通过转储$form->getName()来确认这一点。
现在,所实现的$form->handleRequest方法在提交表单之前通过请求处理程序执行许多检查。
1.检查方法是否与表单的方法匹配
1.如果表单具有名称,则检查请求中是否存在表单名称
1.如果表单没有名称,检查是否至少填写了一个表单域
您的表单未通过请求处理程序handleRequest方法提交,因为请求中的字段未与表单名称正确Map在一起。
您必须以下列方式MapHTTP POST请求中的表单名称:

[ "user_file" =>  [ "file" => <uploaded file> ] ]

这在Postman中可能并不简单,因此我建议将表单实现为一个无名称的表单,而不是重写getBlockPrefix以返回一个空字符串。

class UserFileType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        //...
    }

    public function getBlockPrefix()
    {
        return '';
    }

}
ogq8wdun

ogq8wdun2#

由于这是关键字handlerequest issubmitted false出现的第一个SO线程,我想我会分享我的团队在相邻问题上的工作。
我们在执行PATCH请求时得到了false响应。我们最终意识到在创建表单时忽略了在method选项中传递Request::METHOD_PATCH。放入一个设置该值的三元语句就足以解决我们的问题。
我希望这能帮助到一些人。

相关问题