如何仅将请求对象的差异更改应用到表单
How to apply only diff changes from request object to form
我正在使用 fosrestbundle 实现补丁方法,我想创建合适的补丁方法。
为此,我创建了控制器,并且有一个 patchAction,它接受一个参数 Entity,Entity 是通过我自己编写的 ParamConverter 创建的。实体被传递给 EntityType,这就是问题所在。我只想更新已更改的字段,当我传递实体以形成它时,将空值设置为来自请求的对象。实体是 POPO
流程如下
- 用户向 /entity/{Entity} 发送 PATCH 请求假设 /entity/12
- 参数转换器将 12 转换为正确的实体,向 DB 请求数据
- EntityFormType 将实体作为参数并将数据从请求设置为实体。
- 实体存储到数据库
问题是表单在获取整个实体对象后,将表单上为空的字段设置为空。我更喜欢它是否采用这些值并将其设置为默认值。
我不会也不能使用教义 ORM。
代码:
/**
* @ParamConverter("Entity", class="Entity")
*/
public function patchAction(Entity $entity, Request $request)
{
var_dump($entity); // object mapped from DB
$form = $this->createForm(new EntityType(), $entity);
$form->handleRequest($request);
$form->submit($request);
var_dump($entity);exit; //here I get only values that i passed through patch method, rest of them is set to null
}
我正在考虑表单事件或创建类似 diff 方法的方法,但可能有更好的解决方案?
您需要创建带有 method
选项集的表单。
$form = $this->createForm(new EntityType(), $entity, array(
'method' => $request->getMethod(),
));
如果请求是使用 PATH
方法发送的,那么 Symfony 将只更新发送的字段。
如何在 Symfony 中伪造 PATCH
方法:http://symfony.com/doc/current/cookbook/routing/method_parameters.html#faking-the-method-with-method
我正在使用 fosrestbundle 实现补丁方法,我想创建合适的补丁方法。
为此,我创建了控制器,并且有一个 patchAction,它接受一个参数 Entity,Entity 是通过我自己编写的 ParamConverter 创建的。实体被传递给 EntityType,这就是问题所在。我只想更新已更改的字段,当我传递实体以形成它时,将空值设置为来自请求的对象。实体是 POPO
流程如下
- 用户向 /entity/{Entity} 发送 PATCH 请求假设 /entity/12
- 参数转换器将 12 转换为正确的实体,向 DB 请求数据
- EntityFormType 将实体作为参数并将数据从请求设置为实体。
- 实体存储到数据库
问题是表单在获取整个实体对象后,将表单上为空的字段设置为空。我更喜欢它是否采用这些值并将其设置为默认值。
我不会也不能使用教义 ORM。
代码:
/**
* @ParamConverter("Entity", class="Entity")
*/
public function patchAction(Entity $entity, Request $request)
{
var_dump($entity); // object mapped from DB
$form = $this->createForm(new EntityType(), $entity);
$form->handleRequest($request);
$form->submit($request);
var_dump($entity);exit; //here I get only values that i passed through patch method, rest of them is set to null
}
我正在考虑表单事件或创建类似 diff 方法的方法,但可能有更好的解决方案?
您需要创建带有 method
选项集的表单。
$form = $this->createForm(new EntityType(), $entity, array(
'method' => $request->getMethod(),
));
如果请求是使用 PATH
方法发送的,那么 Symfony 将只更新发送的字段。
如何在 Symfony 中伪造 PATCH
方法:http://symfony.com/doc/current/cookbook/routing/method_parameters.html#faking-the-method-with-method