我有一个用Symfony构建的表单,当在 View 中呈现时,html表单可能包含也可能不包含表单对象中的所有字段(实体种类具有几个不同的状态,并且并非所有字段都在其中风景)。
问题在于,当通过表单对象的handleRequest()方法在提交处理程序中处理表单时,它会将实体中不存在于发布数据中的任何属性重置为null,从而浪费了所有现有值。
有什么方法可以告诉Symfony不要这么愚蠢,而只处理POST数据中存在的字段?
还是我必须在handleRequest调用之前克隆该实体,然后遍历POST值,并将相关值从post-handleRequest实体复制到该实体的pre-handleRequest克隆中,所以我保留了不在其中的字段POST数据。
!如您所见,它有点愚蠢的解决方案,有点愚蠢的问题,TBH。
如果该实体实际上是一个新创建的对象,但是我是从数据库中加载了该对象,然后调用了handleRequest,则我可以理解symfony这样做-应该足够明智,以知道该对象已经被初始化,并且仅设置了在发布数据。
谢谢你的帮助。
问候
史蒂夫。
最佳答案
简而言之,不要使用handleRequest
。
您应该直接使用submit
并将clearMissing
参数设置为false。
Symfony/组件/表单/表单接口(interface)
/**
* 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);
..从请求中获取表单数据数组并直接提交,但是将clear missing fields参数设置为false。