我有一个用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。

10-04 22:37
查看更多