1

给定一个用于管理用户帐户的典型 Doctrine 实体,假设我想为注册用户提供一个表单,该表单仅包含用于修改其专业简历的字段。这意味着只有描述会被传递回update操作:

public function updateAction(Project $project, Request $request)
{
  $user = SOME_RETRIEVED_USER_OBJECT;
  $form = $this->createForm(new UserForm(), $user);
  $form->bindRequest($request);
  ...
}

但是,在执行之后,除了bindRequestbio 之外的所有$user属性值都是空的。肯定有一些方法可以在 Symfony 中执行部分对象更新吗?

4

2 回答 2

4

表单中的字段定义将更新的实体属性。最简单的方法是创建一个单独的表单类型,其中包含一个需要更新和使用的字段

$form = $this->createForm(new UserFormOneField(), $user);

此外,您需要确保为这种情况选择正确的验证组。

于 2012-08-08T17:16:50.230 回答
-1

您可以将表单与收到的 POSTed 值进行比较,并删除不存在的值。您可以将此功能添加到您的控制器:

private function updateFormAccordingToRequest($form){
  $form_fields = array();
  foreach($form->getChildren() as $c) $form_fields[] = $c->getName();
  $post_fields = array_keys($this->getRequest()->request->get($form->getName()));
  $fields_to_remove = array_diff($form_fields, $post_fields);
  foreach($fields_to_remove as $f) $form->remove($f);
  return $form;
}

..然后在您想要进行部分更新时更新您的表单:

$form = $this->createForm(new UserForm(), $user);
$form = $this->updateFormAccordingToRequest($form);
$form->bindRequest($request);
于 2012-11-29T06:18:32.830 回答