symfony中$request->files->get和$form-〈get方法之间的区别

yrdbyhpb  于 2022-11-16  发布在  其他
关注(0)|答案(1)|浏览(108)

在我的symfony项目上,我有一个 AJAX 调用来上传多个文件。

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

但是对于进一步的编码,在$files变量上使用foreach却不起作用。
在另一个页面上有相同的功能,但那是页面提交,所以访问$form对象,在那里工作得很好。

$form->get('file')->getData();

这个参数取数方法有什么区别请帮助说明。

ohtdti5x

ohtdti5x1#

简而言之:因为file字段在第二种情况下不存在。
更详细的解释是这样的:
表单组件构建在HttpFoundation(提供了一种面向对象的方法来处理请求和响应)和一些其他symfony组件之上,不仅提供了表单构建器,还提供了验证、csrf保护、对象Map和其他功能。
在第一个示例中,您使用的是HttpFoundation提供的File ParameterBag,它基本上是$_FILES超全局函数,并且您要访问的是一个名为file的函数,因为它是一个 AJAX 调用,我敢打赌它是一个手工创建的表单或者是一个纯粹的js函数; file字段就是这样命名的。在本例中,您将直接处理原始http请求。
但是,在使用表单组件时,如果您有一个名为file的表单字段,它将不会像这样显示在请求中;表单以数组形式发送,格式为:

[
  'form_name' => [
    'field1' => 'value1',
    // More fields or nested arrays
  ],
];

该组件这样做是为了允许多个表单具有相同的字段,同时能够识别它们等。
作为表单处理的一部分,请求中的字段会Map回表单字段。这就是您的应用在第二种情况下使用的,即发送数据的Form对象表示。有关该过程的更多信息,请参阅文档。您也可以使用浏览器工具或Symfony Profiler检查请求,以获得更多信息。

相关问题