在我的symfony项目上,我有一个 AJAX 调用来上传多个文件。
$files = $request->files->get('file');
但是对于进一步的编码,在$files变量上使用foreach却不起作用。在另一个页面上有相同的功能,但那是页面提交,所以访问$form对象,在那里工作得很好。
$form->get('file')->getData();
这个参数取数方法有什么区别请帮助说明。
ohtdti5x1#
简而言之:因为file字段在第二种情况下不存在。更详细的解释是这样的:表单组件构建在HttpFoundation(提供了一种面向对象的方法来处理请求和响应)和一些其他symfony组件之上,不仅提供了表单构建器,还提供了验证、csrf保护、对象Map和其他功能。在第一个示例中,您使用的是HttpFoundation提供的File ParameterBag,它基本上是$_FILES超全局函数,并且您要访问的是一个名为file的函数,因为它是一个 AJAX 调用,我敢打赌它是一个手工创建的表单或者是一个纯粹的js函数; file字段就是这样命名的。在本例中,您将直接处理原始http请求。但是,在使用表单组件时,如果您有一个名为file的表单字段,它将不会像这样显示在请求中;表单以数组形式发送,格式为:
file
HttpFoundation
File ParameterBag
$_FILES
[ 'form_name' => [ 'field1' => 'value1', // More fields or nested arrays ], ];
该组件这样做是为了允许多个表单具有相同的字段,同时能够识别它们等。作为表单处理的一部分,请求中的字段会Map回表单字段。这就是您的应用在第二种情况下使用的,即发送数据的Form对象表示。有关该过程的更多信息,请参阅文档。您也可以使用浏览器工具或Symfony Profiler检查请求,以获得更多信息。
Form
1条答案
按热度按时间ohtdti5x1#
简而言之:因为
file
字段在第二种情况下不存在。更详细的解释是这样的:
表单组件构建在HttpFoundation(提供了一种面向对象的方法来处理请求和响应)和一些其他symfony组件之上,不仅提供了表单构建器,还提供了验证、csrf保护、对象Map和其他功能。
在第一个示例中,您使用的是
HttpFoundation
提供的File ParameterBag
,它基本上是$_FILES
超全局函数,并且您要访问的是一个名为file
的函数,因为它是一个 AJAX 调用,我敢打赌它是一个手工创建的表单或者是一个纯粹的js函数;file
字段就是这样命名的。在本例中,您将直接处理原始http请求。但是,在使用表单组件时,如果您有一个名为
file
的表单字段,它将不会像这样显示在请求中;表单以数组形式发送,格式为:该组件这样做是为了允许多个表单具有相同的字段,同时能够识别它们等。
作为表单处理的一部分,请求中的字段会Map回表单字段。这就是您的应用在第二种情况下使用的,即发送数据的
Form
对象表示。有关该过程的更多信息,请参阅文档。您也可以使用浏览器工具或Symfony Profiler检查请求,以获得更多信息。