鉴于用于管理说用户帐户的典型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中执行部分对象更新吗?
答案 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);