Symfony2 - 如何从发布数据中不存在的归零字段中停止Form-> handleRequest

Ste*_*lds 23 php forms symfony

我有一个在Symfony中构建的表单,当在视图中呈现时,html表单可能包含也可能不包含表单对象中的所有字段(实体类型具有几个不同的状态,并且并非所有字段都在风景).

问题是,当表单在提交处理程序中处理时,通过表单对象的handleRequest()方法,它将实体中不存在于post数据中的任何属性重置为null,从而吹掉任何现有值.

有没有办法告诉Symfony不要这么愚蠢,只处理POST数据中的字段?

或者我必须在handleRequest调用之前克隆实体,然后循环POST值并将post-handleRequest实体中的相关值复制到实体的pre-handleRequest克隆,因此我保留不在的字段POST数据.

唷!正如你所看到的,它有点愚蠢的解决方案,有点愚蠢的问题,tbh.

我可以理解symfony这样做,如果实体实际上是一个新创建的对象,但它已从DB加载然后调用handleRequest - 它应该足够明智地知道对象已经初始化并且只设置传入的字段发布数据.

谢谢你的帮助.

问候

史蒂夫.

qoo*_*mao 49

总之,不要使用handleRequest.

您应该submit直接使用,并将clearMissing参数设置为false.

Symfony/Component/Form/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);
Run Code Online (Sandbox Code Playgroud)

当您使用handleRequest它时,计算出您想要提交的数据,然后使用提交$form->submit($data, 'PATCH' !== $method);,这意味着除非您使用该PATCH方法提交了表单,否则它将清除字段.

要自己提交表格而不清除您可以使用...

$form->submit($request->get($form->getName()), false);
Run Code Online (Sandbox Code Playgroud)

..从请求中获取表单数据数组并直接提交,但明确缺少字段参数设置为false.

  • 但是如果表单有文件怎么办?如果使用$ request-> get($ form-> getName())方法获取所有数据,它们是否会丢失?似乎有必要重现handleRequest所做的所有事情,但是使用$ clearMissing参数的不同值调用submit方法.也许最好重写方法类型?例如,使用POST而不是GET,并将方法类型设置为PATCH. (4认同)
  • 我总是使用`$ request-> files-> get($ form-> getName())`但是可能有更好的方法.理想情况下,您可以将`$ clearMissing`传递给请求处理程序...或者您可以使用`PATCH`方法发送表单并保持`handleRequest()`.甚至更多的是,你可以自己动手做点工作,从https://github.com/symfony/symfony/blob/master/src/Symfony/Component/Form/NativeRequestHandler.php#L65-L86获取想法 (4认同)