如何在不使用表单构建器的情况下取消映射文件输入?

时间:2014-01-13 22:03:00

标签: symfony twig

我继承了一个在表单生成器存在之前似乎已存在的应用程序。开发人员使用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序列化?

1 个答案:

答案 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)
);

我希望这有助于其他人!