我继承了一个在表单生成器存在之前似乎已存在的应用程序。开发人员使用twig宏滚动自己。现在我想将文件上传添加到一些现有表单中,但我得到了一个众所周知的错误:
有1个错误:
myBundle \测试\控制器\剪断\ DefaultControllerUnitTest :: testCanStoreDocumentAtS3 例外:序列化 不允许使用'Symfony \ Component \ HttpFoundation \ File \ UploadedFile'
C:\ apath \厂商\ symfony的\ symfony的\ SRC \的Symfony \元器件\ HttpKernel \ DataCollector \ DataCollector.php:27
C:\ apath \厂商\ symfony的\ symfony的\ SRC \的Symfony \元器件\ HttpKernel \探查\ Profiler.php:218
解决方案是取消映射文件字段:
$ builder->添加( 'PIC', '文件'); 对此:
$builder->add('pic','file', array('mapped'=>false));
但在这种情况下,不使用构建器。相反它看起来像这样:
{# file(name, value) #}
{% macro file(name, value) %}
<input type="file" name="{{ name }}" id="{{ name }}" value="{{ value }}" />
{% endmacro %}
我可以添加到此宏中,还是在控制器操作中执行以防止Profiler序列化?
答案 0 :(得分:1)
答案是部分飞行员错误,但这里有足够的进展,我希望我可以帮助其他人避免同样的陷阱。
此错误是由单元测试触发的,我在其中模拟文件上传以及其他参数。最初导致此错误的代码是:
$photo = new UploadedFile(
__DIR__ . '/TestReportMethod.xlsx',
'TestReportMethod.xlsx',
'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
123
);
....
$form['reportFile'] = $photo;
//submit
这导致我原帖中的错误。
在尝试了一些事情后,我转而使用此格式。
$crawler = $this->client->request('POST',
$url,
array('id' => 328),
array('agencyInfoId' => 328),
array('reportFile' => $photo)
);
导致InvalidArgumentException的原因我觉得在本教程中可能有一个更好的例子。正确的表单需要是一个参数值数组,后跟一个文件数组:
$crawler = $this->client->request('POST',
$url,
array('id' => 328,
'agencyInfoId' => 328),
array('reportFile' => $photo)
);
我希望这有助于其他人!