我有一个在Symfony中构建的表单,并且在视图中呈现时,html表单可能包含也可能不包含表单对象中的所有字段(实体类型有几种不同的状态,并且不是所有字段都被包含在风景).
问题是,当在提交处理程序中处理表单时,通过表单对象的handleRequest()方法,将该实体中不存在于该数据中的任何属性重新设置为null,从而消除任何现有值.
有没有办法告诉Symfony不要那么愚蠢,只处理POST数据中存在的字段?
或者我必须在handleRequest调用之前克隆实体,然后循环遍历POST值,并将相关值从post-handleRequest实体复制到实体的pre-handleRequest克隆,因此我保留不在POST数据.
唷!正如你所看到的,它有点愚蠢的解决方案,有点尴尬的问题,tbh.
我可以理解symfony这样做,如果实体是一个新创建的对象,但它已经从DB加载,然后调用handleRequest – 它应该是明智的,知道该对象已被初始化,只设置在发布数据.
感谢任何帮助.
问候
史蒂夫.
总之,不要使用handleRequest.
您应该直接使用submit,而将clearMissing参数设置为false.
的Symfony /组件/表格/ FormInterface
/** * Submits data to the form,transforms and validates it. * * @param null|string|array $submittedData The submitted data. * @param bool $clearMissing Whether to set fields to NULL * when they are missing in the * submitted data. * * @return FormInterface The form instance * * @throws Exception\AlreadySubmittedException If the form has already been submitted. */ public function submit($submittedData,$clearMissing = true);
当您使用handleRequest时,它会处理您想要提交的数据,然后使用$form-> submit($data,’PATCH’!== $method)提交它;这意味着除非您使用PATCH方法然后它会清除字段.
自己提交表单,不用清除可以使用…
$form->submit($request->get($form->getName()),false);
..它从请求中获取表单数据数组,并直接提交,但是将缺少的字段参数设置为false.