在表单绑定后使用原始数据保存对象

时间:2014-01-23 15:41:56

标签: php symfony sonata-admin

我想制作一个修订选项,用于在Sonata Admin中保存某些对象。

我想以下列方式做到这一点:

  • 用户编辑条目
  • 表格已经过验证
  • 新信息将另存为一个单独的条目(我称之为revision
  • 除了与修订版
  • 的关系外,原始对象不会被修改

所以代码看起来像这样(来源Sonata\AdminBundle\Controller\CRUDController::editAction()):

$object = $this->admin->getObject($id);
$this->admin->setSubject($object);
$form = $this->admin->getForm();
$form->setData($object);

$form->bind($this->get('request')); // does this persist the object ?

// and here is what I basically want to do:
$object->setId(null);
$orig = $em->getRepository("MedtravelClinicBundle:Clinic")->find($id);
$orig->setRevision($object);
$this->admin->update($orig);

问题是$orig加载了已经修改的内容,因此var_dump($orig === $object)true

我也试过$em->getUnitOfWork()->getOriginalEntityData($object); - 它抓取了正确的数据,但是作为一个数组,而不是一个对象(这可能是最后的手段)。

那么,如何在表单绑定发生后获取(并保存)原始对象?

1 个答案:

答案 0 :(得分:1)

我认为您应该使用clone关键字来获取要存储的对象的独立实例。它应该按照以下步骤工作:

  1. 加载原始实体($object
  2. 克隆原始实体以获取新的临时实体($newObject
  3. 更改$newObject以使其成为条目:$newObject->setId(null);
  4. $newObject绑定到表单
  5. 保存(保留)$newObject作为修订
  6. 将修订添加到($object)并将其保留
  7. 我希望如果表单无效,您将无法丢失用户发送的所有数据。

    为了以防万一,我使用this answer来查找原始实体与表单修改的实体之间的差异。