Symfony表单 - 部分对象更新

时间:2012-08-08 16:54:01

标签: php symfony1 doctrine

鉴于用于管理说用户帐户的典型Doctrine实体,假设我想为注册用户提供仅包含用于修改其专业bio的字段的表单。这意味着将描述传递回update操作:

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

但是,在执行bindRequest后,bio的所有$user属性值外都是空的。当然有一些方法可以在Symfony中执行部分对象更新吗?

2 个答案:

答案 0 :(得分:4)

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

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

此外,您需要确保为此案例选择正确的验证组。

答案 1 :(得分:-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);