如何仅应用从请求对象到表单的差异更改

时间:2016-04-05 12:03:56

标签: php symfony fosrestbundle

我正在使用fosrestbundle实现补丁方法,我想创建适当的补丁方法。

为了做到这一点,我创建了控制器,并且有一个patchAction,它接受一个参数Entity,Entity是通过我自己编写的ParamConverter传递的。实体传递给EntityType,这就是问题所在。我想只更新更改的字段,当我传递Entity以形成它时,将null设置为来自请求的对象。实体是POPO

这里是流程

  1. 用户将PATCH请求发送到/ entity / {Entity}让我们说/ entity / 12
  2. Param转换器将12转换为适当的实体,向DB请求数据
  3. EntityFormType将Entity作为参数,并将数据从请求设置为实体。
  4. 实体存储到DB
  5. 问题是,在获取整个Entity对象后,它为表单上为null的字段设置null。如果它采用这些值并将其设置为默认值,我更喜欢。

    我不能并且不能使用学说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方法的东西,但可能有更好的解决方案?

1 个答案:

答案 0 :(得分:2)

您需要设置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